성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] How can I tell whether two programs...
[정성태] The case of the fail-fast crashes c...
[정성태] Creating Docker multi-arch images f...
[정성태] BinaryFormatter removed from .NET 9...
[정성태] Extending the Windows Shell Progres...
[우광현] 와..... 범위를 잡았으니 클라이언트가 해당 범위를 확인해본다...
[정성태] 딱히, 그것 이상으로 더 설명할 내용이 없습니다. 동적 포...
[정성태] If Windows 3.11 required a 32-bit p...
[정성태] What is a hard error, and what make...
[괴물신인] 질문작성자인데 이 글을 이제봤네요 ㄷㄷ 이 글처럼 타입별로 인...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>ASP.NET Core를 docker에서 실행 시 "Failed with a critical error." 오류 발생</h1> <p> "Enable Docker Support"와 "Configure for HTTPS" 옵션을 켜고 생성한 ASP.NET Core Web Application을 실행 시 다음과 같은 질문 창이 뜹니다.<br /> <br /> <div style='BACKGROUND-COLOR: #ccffcc; padding: 10px 10px 5px 10px; MARGIN: 0px 10px 10px 10px; FONT-FAMILY: Malgun Gothic, Consolas, Verdana; COLOR: #005555'> This project is configured to use SSL. In order for debugging to work, the self-signed certificate that ASP.NET Core has generated should be trusted. <br /> <br /> If you do not want to be asked to trust the certificate again, please open "Tools -> Options -> Container Tools" and check "Do not prompt for trusting localhost SSL certificate". <br /> <br /> Would you like to trust the ASP.NET Core SSL certificate?<br /> </div><br /> <br /> "Yes"를 선택하고 진행하는데 오류 창이 뜨면서 실행이 막힙니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Adding the certificate to the Trusted Root Certficates store failed with the following error: Failed with a critical error. </pre> <br /> 검색해 보면 저 질문 후의 과정이 https 지원 시 "localhost"에 대한 인증서를 자동으로 발급하는 거라고 합니다. 이에 대해서는 아래의 글에 어떤 작업을 하는지 상세하게 설명합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > VS2017 Docker debugging failed: Failed to create the certificate ; <a target='tab' href='https://github.com/Microsoft/DockerTools/issues/99'>https://github.com/Microsoft/DockerTools/issues/99</a> </pre> <br /> 실제로 Visual Studio가 자동화하는 과정을 수동으로 할 수 있는데 우선 다음의 명령어로 Web Application에 해당하는 테스트 인증서를 생성하는 것으로 시작합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > [형식] dotnet dev-certs https --trust -ep "%APPDATA%\ASP.NET\https\{WebApplication_프로젝트_이름}.pfx" -p {인증서_암호} [예제 - 프로젝트 이름이 "netcore_web"인 경우] dotnet dev-certs https --trust -ep "%APPDATA%\ASP.NET\https\netcore_web.pfx" -p TestPassword </pre> <br /> 위와 같이 실행하면 "%APPDATA%\ASP.NET\https" 폴더에 netcore_web.pfx라는 이름으로 인증서가 만들어집니다. 그리고 이 인증서를 마우스로 두 번 클릭해 등록해 줍니다. 2군데에 등록해야 하는데 "Personal"과 "Trusted Root Certification Authorities"에 각각 있어야 합니다. (명령행에서 "certmgr"을 입력해 "Certificates - Current User" 인증서 관리 창을 띄워 다음과 같이 등록된 것을 확인할 수 있습니다.)<br /> <a name='aspnet_cert'></a> <br /> [그림 - "ASP.NET Core HTTPS development certificate" 인증서]<br /> <img onclick='toggle_img(this)' class='imgView' alt='aspnet_docker_ssl_support_1.png' src='/SysWebRes/bbs/aspnet_docker_ssl_support_1.png' /><br /> <br /> 그다음 인증서에 대한 암호(위의 예에서는 TestPassword)를 csproj 파일에 등록해야 합니다. 방법은 이전에 한번 소개했던 user-secrets로 하는데,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > dotnet user-secrets 명령어 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11447'>http://www.sysnet.pe.kr/2/0/11447</a> </pre> <br /> 따라서 웹 애플리케이션의 csproj 파일이 위치한 폴더에서 다음의 명령을 실행합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > [형식] dotnet user-secrets set Kestrel:Certificates:Development:Password {인증서_암호} 예) dotnet user-secrets set Kestrel:Certificates:Development:Password TestPassword </pre> <br /> 실행 후 csproj에는 UserSecretsId가 등록되고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>netcoreapp2.1</TargetFramework> <DockerTargetOS>Linux</DockerTargetOS> <span style='color: blue; font-weight: bold'><UserSecretsId>{...GUID...}</UserSecretsId></span> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.AspNetCore.App" /> <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.0.1916590" /> </ItemGroup> </Project> </pre> <br /> 해당 GUID 이름의 폴더가 %APPDATA%\Microsoft\UserSecrets 하위에 생성되고 그 안의 "secrets.json" 파일은 다음의 내용을 포함하게 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > { "Kestrel:Certificates:Development:Password": "TestPassword" } </pre> <br /> 바로 여기까지가 Visual Studio가 자동으로 해주는 작업입니다. 그런데, 이렇게 맞추고 실행해도 여전히 "Failed to create the certificate" 오류가 발생합니다. 글쎄요... 다음의 글들에 따라 해봐도,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Adding the certificate to the Trusted Root Certificate store failed with the following error: Failed with a critical error. ; <a target='tab' href='https://github.com/Microsoft/DockerTools/issues/147'>https://github.com/Microsoft/DockerTools/issues/147</a> VS2017 Docker debugging failed: Failed to create the certificate ; <a target='tab' href='https://github.com/Microsoft/DockerTools/issues/99'>https://github.com/Microsoft/DockerTools/issues/99</a> Visual Studio 2017 gives 'Adding the Certificate to The Trusted Root Certificates store failed with the following Errror' ; <a target='tab' href='https://stackoverflow.com/questions/47413183/visual-studio-2017-gives-adding-the-certificate-to-the-trusted-root-certificate?rq=1'>https://stackoverflow.com/questions/47413183/visual-studio-2017-gives-adding-the-certificate-to-the-trusted-root-certificate?rq=1</a> </pre> <br /> 제 경우에는 해당 오류가 없어지지 않았습니다. 그럼 어떻게 해결할 수 있을까요? ^^<br /> <br /> 해결하지 않아도 됩니다. 어차피 인증서까지 모두 등록되었으므로 Visual Studio는 실행을 할 수 있기 때문에 그냥 저 확인 과정을 생략하도록 "Tools" / "Options" 메뉴에서 "Container Tools" 범주의 "Do not prompt for trusting localhost SSL certificate" 옵션을 설정해 주면 됩니다.<br /> <br /> 이렇게 하고 실행하면 환경 구성이 잘 되었으므로 Visual Studio는 아무런 문제없이 docker 배포 후 웹 사이트를 구동시켜 줍니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 참고로, 인증서를 로그인한 계정 외의 환경에서도 사용해야 한다고 하면 pfx 인증서를 "Certificates - Local Computer" 범주로도 등록시켜 주면 됩니다. (확인을 위해 명령행에서 "certlm"을 실행해 정상적으로 "Personal"과 "Trusted Root Certification Authorities"에 등록 여부를 보면 됩니다.)<br /> <br /> 참고로, "Do not prompt for trusting localhost SSL certificate" 옵션이 켜져 있어서 이후의 웹 프로젝트를 새로 등록했을 때에는 저 과정을 잊어버리고 웹 애플리케이션을 실행할 수 있을 텐데요, 이런 경우 다음과 같은 오류가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > System.InvalidOperationException HResult=0x80131509 Message=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. Source=Microsoft.AspNetCore.Server.Kestrel.Core StackTrace: at Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps(ListenOptions listenOptions, Action`1 configureOptions) at Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps(ListenOptions listenOptions) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.AddressesStrategy.<BindAsync>d__2.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.<BindAsync>d__0.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.<StartAsync>d__22`1.MoveNext() ...[생략]... at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNetCore.Hosting.WebHostExtensions.Run(IWebHost host) at netcore_web.Program.Main(String[] args) in F:\netcore_web\netcore_web\Program.cs:line 17 </pre> <br /> 잊지 말고 ^^ 웹 애플리케이션 이름의 pfx를 생성해 주고 user-secrets를 등록해야 합니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> check 한번 해보는 것도 좋겠습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp> <span style='color: blue; font-weight: bold'>dotnet dev-certs https --check</span> A valid certificate was found: 3827...[생략]...85E5 - CN=localhost - Valid from 2022-01-18 10:03:29Z to 2023-01-18 10:03:29Z - IsHttpsDevelopmentCertificate: true - IsExportable: true Run the command with both --check and --trust options to ensure that the certificate is not only valid but also trusted. </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
7862
(왼쪽의 숫자를 입력해야 합니다.)