あるSEのつぶやき・改

ITやシステム開発などの技術に関する話題を、取り上げたりしています。

ASP.NET CoreでHTTPSエラーが発生する現象の対処方法

いつのバージョンからか分からないのですが、ASP.NET Core 2.xで MVC のプロジェクトを作成して実行すると、以下のような HTTPS のエラーが発生するようになってしまいました。

なお、環境は、macOS Mojave で .NET Core 2.2.100-preview2 になります。

crit: Microsoft.AspNetCore.Server.Kestrel[0]
      Unable to start Kestrel.
System.InvalidOperationException: Unable to configure HTTPS endpoint. No server certificate was specified, and the default developer certificate could not be found.
To generate a developer certificate run 'dotnet dev-certs https'. To trust the certificate (Windows and macOS only) run 'dotnet dev-certs https --trust'.
For more information on configuring HTTPS see https://go.microsoft.com/fwlink/?linkid=848054.

紆余曲折あったのですが、ようやく解決方法を見つけました。

解決方法は、OpenSSL で pfx 形式の証明書を作成してプログラムで読み込むようにします。

まず、OpenSSL で自己証明書(いわゆるオレオレ証明書)を作成します。

プロジェクトのルートフォルダに移動し秘密鍵を作成します。

$ openssl genrsa 2024 > server.key

証明書署名要求(CSR / Certificate Signing Request)を作成します。

$ openssl req -new -key server.key > server.csr

Country Name (2 letter code) []:
State or Province Name (full name) []:
Locality Name (eg, city) []:
Organization Name (eg, company) []:
Organizational Unit Name (eg, section) []:
Common Name (eg, fully qualified host name) []:localhost
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: password

サーバー証明書を作成します。

ここでは有効期限を10年(3650日)としています。

$ openssl x509 -req -days 3650 -signkey server.key < server.csr > server.crt

サーバー証明書を crt 形式(と秘密鍵)から pfx 形式に変換します。パスワードは"password"と設定しています。

$ openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt
Enter Export Password:
Verifying - Enter Export Password:

そして、ASP.NET MVC プロジェクトの Program.cs を以下のように修正します。

//追加
using System.Net;

//(中略)

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseKestrel(options =>
            {
                options.Listen(IPAddress.Loopback, 5000);
                options.Listen(IPAddress.Loopback, 5001, listenOptions =>
                {
                    listenOptions.UseHttps("server.pfx","password");
                });
            })  
            .UseStartup<Startup>();

この状態でビルド&実行します。

$ dotnet build
$ dotnet run

SSL/TLS 証明書の警告はでるものの、以下のように問題なく表示されるようになりました。

f:id:fnyablog:20181005203704p:plain:w640

本当、解決策を見つけるまで苦労しました。

しかし、プロジェクトがデフォルトの状態で動作しないというのはどうかと思うのですけどね。

参考までに、何も対応しなかった場合のエラーログも載せておきます。

crit: Microsoft.AspNetCore.Server.Kestrel[0]
      Unable to start Kestrel.
System.InvalidOperationException: Unable to configure HTTPS endpoint. No server certificate was specified, and the default developer certificate could not be found.
To generate a developer certificate run 'dotnet dev-certs https'. To trust the certificate (Windows and macOS only) run 'dotnet dev-certs https --trust'.
For more information on configuring HTTPS see https://go.microsoft.com/fwlink/?linkid=848054.

ログによれば、以下のコマンドを実行すれば解決するはずなにの解決しなかったのですよね。

$ dotnet dev-certs https
$ dotnet dev-certs https --trust