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

StackOverflow https://stackoverflow.com/questions/1345262

  •  20-09-2019
  •  | 
  •  

문제

자체 서명 된 인증서 (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 기계에서는 괜찮습니다. 개인 키 액세스가 필요하기 때문에 *.pfx가 *.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>

Makecert의 버전 v5.131.3790.0을 사용하고 있습니다

도움이 되었습니까?

해결책

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

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

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

디스크에서 인증서를 읽고 객체에 저장하고 있지만 개인 키는 여전히 Microsoft 암호화 API 암호화 서비스 제공 업체 키 데이터베이스에 저장됩니다. 호스팅 서버에서 ASP.NET 프로세스에는 사용자 저장소에 액세스 할 수있는 권한이 없습니다.

다른 접근법 (아래의 일부 의견에 따라)은 IIS 구성 또는 앱 풀 ID를 수정하는 것입니다. 그러나 이는 이러한 구성 항목에 액세스 할 수 있다고 가정합니다. 그렇지 않을 수 있습니다 (예 : 공유 호스팅 환경에서).

다른 팁

Randy의 MachineKeyset으로 변경하는 솔루션을 시도했지만 오류 메시지를 받았습니다.

"지정된 상태에서 사용하는 데 유효하지 않음"

그래서 약간의 인터넷 검색 후 나는 그것을 변경할 것을 제안하는 게시물을 찾았습니다.

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

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

IIS 구성에서 설정 앱 풀 설정을 변경하기 위해 아직 제안을 시도하지 않았습니다. 이렇게하려면 사이트 앱 풀의 고급 설정으로 이동 한 다음 "사용자 프로파일로드"를 true로 설정하십시오. 이 설정이 False 인 경우 키 컨테이너에 액세스 할 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top