"내부 오류가 발생했습니다." X509Certificate2로 pfx 파일을로드 할 때


79

자체 서명 된 인증서 (C #)를 사용하려고합니다.

X509Certificate2 cert = new X509Certificate2(
    Server.MapPath("~/App_Data/myhost.pfx"), "pass");

공유 웹 호스팅 서버에서 오류가 발생했습니다.

System.Security.Cryptography.CryptographicException: An internal error occurred.

스택 추적은 다음으로 끝납니다.

System.Security.Cryptography.CryptographicException.
    ThrowCryptogaphicException(Int32 hr) +33
System.Security.Cryptography.X509Certificates.X509Utils.
    _LoadCertFromFile(String fileName, IntPtr password, UInt32 dwFlags, 
        Boolean persistKeySet, SafeCertContextHandle& pCertCtx) +0
System.Security.Cryptography.X509Certificates.X509Certificate.
    LoadCertificateFromFile(String fileName, Object password, 
        X509KeyStorageFlags keyStorageFlags) +237
System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(
    String fileName, String password) +131

내 dev 컴퓨터에서 정상적으로로드됩니다. 개인 키 액세스가 필요하기 때문에 * .cer 파일이 아닌 * .pfx를로드하는 이유 (cer 파일로드 확인). 내 dev mochine에서 pfx를 다음과 같이 만들었습니다.

makecert -r -n "CN=myhost.com, E=admin@myhost.com" -sky exchange -b 01/01/2009
    -pe -sv myhost.pvk myhost.cer
<b>pvk2pfx</b> -pvk myhost.pvk -spc myhost.cer -pfx myhost.pfx -po pass</code>

버전 v5.131.3790.0의 makecert를 사용하고 있습니다.


아마도이 기사가 도움이 될 것입니다 : codeproject.com/KB/WCF/wcfcertificates.aspx
Emmanuel

오류 메시지가 나타납니다 the system cannot find the file specified. @Randy Levy의 답변이 저에게 효과적이었습니다!
Jess

답변:


145

개인 키에 로컬 컴퓨터 저장소를 사용하십시오.

X509Certificate2 cert = new X509Certificate2("myhost.pfx", "pass",
    X509KeyStorageFlags.MachineKeySet);

MachineKeySet"개인 키는 현재 사용자 저장소가 아닌 로컬 컴퓨터 저장소에 저장 됨"으로 설명됩니다. 플래그가없는 기본값은 사용자 저장소에 배치하는 것입니다.

디스크에서 인증서를 읽고이를 오브젝트에 저장하더라도 개인 키는 여전히 Microsoft Cryptographic API Cryptographic Service Provider 키 데이터베이스에 저장됩니다. 호스팅 서버에서 ASP.NET 프로세스에는 사용자 저장소에 액세스 할 수있는 권한이 없습니다.

또 다른 접근 방식 (아래 설명에 따라)은 IIS 구성 또는 앱 풀 ID를 수정하는 것입니다. 그러나 이것은 경우가 아닐 수있는 이러한 구성 항목에 대한 액세스가 있다고 가정합니다 (예 : 공유 호스팅 환경에서).


3
예, 도움이됩니다. 감사합니다. 이유를 설명해 주시겠습니까? 문서에 도움이되는 내용이 없습니다.

2
당신은 내 하루를 구했습니다. 이상하게도 솔루션을 .NET 4.0으로 업그레이드하기 전에 내 컴퓨터에서 작동했습니다
Marc Climent

1
실제로 필요한 모든 작업은 X509KeyStorageFlags.MachineKeySet 매개 변수를 설정하는 것입니다. throw 된 예외가 단순히 "내부 오류가 발생했습니다."라고 표시되는 것은 정말 슬픈 일입니다. 별로 도움이되지 않습니다.
Nicholi 2011 년

2
앱 풀에 할당 된 계정에 개인 키에 대한 더 많은 권한을 추가 할 수도 있습니다. 또는 앱 풀 ID를 "Local Service"로 변경하십시오.
guzart

1
그리고 빠른 수정 / 해결 방법 확인을 위해 : stackoverflow.com/questions/9951729/...
치프 리안 Teiosanu

13

Randy의 솔루션을 MachineKeySet으로 변경하려고 시도했지만 오류 메시지가 나타납니다.

"지정된 상태에서 사용할 수없는 키"

그래서 약간의 인터넷 검색 후 나는 그것을 다음과 같이 변경하는 것을 제안하는 게시물을 발견했습니다.

var certificate = new X509Certificate2(certKeyFilePath, passCode, 
X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet |       
X509KeyStorageFlags.PersistKeySet );

그리고 이것은 내 문제를 분류했습니다.

IIS 구성에서 설정 앱 풀 설정을 변경하라는 제안을 아직 시도하지 않았습니다. 이렇게하려면 사이트의 앱 풀에 대한 고급 설정으로 이동 한 다음 "사용자 프로필로드"를 true로 설정합니다. 이 설정이 false이면 키 컨테이너에 분명히 액세스 할 수 없습니다.


위에서 언급 한 오류가 발생했으며 솔루션이 문제를 해결하는 데 도움이되었습니다. 감사합니다.
dotcoder

도움이되지 않는 댓글 (이것처럼)은 싫지만, 당신이 내 하루를 구했다는 것을 말씀 드리겠습니다. 감사!
rasputino
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.