Kestrel 에서 PEM 인증서를 코드로 적용 하는 방법이 궁금합니다. (잘 안되네요)

안녕하세요?

Kestrel 서버를 이용하여 브라우저를 인터페이스로 동작 시키려는 간단한 어플리케이션을 구상중입니다.

주로 AZURE 나 IIS 로 배포 할때 인증서는 너무 쉽게 https 환경을 구성 하였는데요.
이번에는 아주 간소하게 EXE 파일 클릭 만으로 간단하게 동작하는 로컬웹서비스를 구현 하려 하고 있습니다만, https 설정이 생각처럼 쉽지 않네요. 그러던 와중에 아래의 방법을 시도 하였습니다.

mkcert 이용하여 사설 PEM 인증서를 생성 하였습니다. 이것을 이용해 appsetting.json 으로 아래와 같이 적용 하였고, https://localhost:5003 으로 정상 작동 하였습니다.

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },

...중략...

  "Kestrel": {
    "Endpoints": {
      "HttpsFromPem": {
        "Url": "https://localhost:5003",
        "Certificate": {
          "Path": "cert/localhost.pem",
          "KeyPath": "cert/localhost-key.pem"
        }
      }
    }
  },

...중략...
  "AllowedHosts": "*"
}

하지만 빌드후 쉽게 손질? 이 가능한 appsetting.json 으로 설정하는 방법 대신 동일한 작동을 하도록 코드로 구현 하고자 하는 마음에, 앞서 작성한 appsetting.json을 원상 복구 하고, 다음과 같이 작성 하였습니다만 https://localhost:5003 으로 접속 되지 않았습니다.


...중략...

var x509 = X509Certificate2.CreateFromPemFile(@"cert\localhost.pem", @"cert\localhost-key.pem");
//혹시나 해서 키가 올바른지 검사 해 보았습니다. 
if (x509.HasPrivateKey == true)
{
    Console.WriteLine("Has private key");
}
else
{
    Console.WriteLine("No private key");
}

builder.WebHost.ConfigureKestrel((context, options) =>
{
    options.ListenLocalhost(5003, listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
        listenOptions.UseHttps(x509);
    });
});

...중략...

이런저런 방법을 많이 시도 해봤지만 제가 무언가 사소한것을 착각 하고 있는것일지, 고민 끝에 질문을 남겨 봅니다.
appsetting.json 에서 작동 했다면 분명 코드로도 동일하게 구현 할 수 있을것이라 생각하는데, 제 생각이 잘못된 것일지요 ?

감사합니다.

2 Likes

저도 관련해서 시행착오를 겪은 적이 있는데,

닷넷: 2162. ASP.NET Core 웹 사이트의 SSL 설정을 코드로 하는 방법 (sysnet.pe.kr)

같은 문제라면, pfx로 바꿔 해결할 수 있을 것입니다.

4 Likes

감사합니다. 역시 sysnet 의 결론을 따라야 하는군요.
알아보니 openssl 말고, mkcert 로도 pfx 를 만들수 있어서 다행입니다. 예시는 다음과 같습니다.

mkcert -pkcs12 localhost 

를 하면 해당 폴더에 localhost.p12 가 생성 되는데, 이것을 pfx 자리에 넣어도 됩니다.
그리고 기본 비밀번호는 changeit 입니다.
(비밀번호를 바꾸는 방법까진 못알아 봤네요)

그리 하여 아래와 같이 꾸몄습니다.

 builder.WebHost.ConfigureKestrel((context, options) =>
 {
     options.ListenLocalhost(5003, listenOptions =>
     {
         listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
         listenOptions.UseHttps(@"cert\localhost.p12" , "changeit");
     });
 });

이후 https 가 잘 작동 되었습니다.

다른 컴퓨터에 배포시 mkcert 이용하여 CA 잡고 p12 생성까지 자동화 할 수 있을것 같습니다.
감사합니다.

4 Likes