2016-08-09 2 views
0

RSA 비공개 키 파일을 사용하여 RSACryptoServiceProvider 객체를 올바르게 만들려면 어떻게해야합니까? 나는 RSA 개인 키를 생성 방법을 사용하여 OSX에 P12 파일로 내보내기 : 윈도우 노트북에서 실행 내 C# 코드에서는 C# RSA 비공개 키 파일을 사용하여 RSACryptoServiceProvider 객체 만들기

openssl genrsa -out rsakey.pem 2048 
openssl pkcs12 -export -out rsakey.p12 -inkey rsakey.pem -nocerts 

, 나는 그렇게 X509Certificate2 개체를 인스턴스화하는 동안 오류를 얻고있다 나는 그것의를 벗어난 RSACryptoServiceProvider 객체와 개인 키를 잡아 수 :

var privateKey = new X509Certificate2(p12_file, "pass", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet).PrivateKey as RSACryptoServiceProvider; 

CryptographicException를 :이 매개 변수가 잘못되었습니다.

다음은 참조 용 전체 C# 코드입니다. 단지 X509Certificate2 클래스에 대한 문서를 따라 RSACryptoServiceProvider 객체로 개인 키를 가져 오려고합니다.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.IO; 
using System.Net; 
using System.Security; 
using System.Security.Cryptography; 
using System.Security.Cryptography.X509Certificates; 
using System.Globalization; 
using Jose; 
using Newtonsoft.Json; 
using Newtonsoft.Json.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string p12_file = @"C:\Root\rsakey.p12"; 

      DateTime issued = DateTime.Now; 
      DateTime expire = DateTime.Now.AddHours(10); 

      var payload = new Dictionary<string, object>() 
      { 
       { "iss", "auth0_user"}, 
       { "exp", ToUnixTime(expire).ToString() } 
      }; 

      var privateKey = new X509Certificate2(p12_file, "pass", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet).PrivateKey as RSACryptoServiceProvider; 

      string token = Jose.JWT.Encode(payload, privateKey, JwsAlgorithm.RS256); 

      Console.WriteLine(token); 

     } 

     static long ToUnixTime(DateTime dateTime) 
     { 
      return (int)(dateTime.ToUniversalTime().Subtract(new DateTime(1970, 1, 1))).TotalSeconds; 
     } 

    } 
} 

UPDATE :

openssl pkcs12 -export -out rsakey.p12 -in rsakey.pem -certfile domain.crt 

하지만 명령이 그냥 죽일 때까지 영원히 응답 : 나는 P12로 포장 한 후

openssl req -key rsakey.pem -new -out domain.crt 

과를 사용하여 내 자체 서명 된 인증서를 만들려고 그것.

답변

0

.NET에는 인증서와 관련되지 않은 개인 키 (또는 공개 키)를 읽을 수있는 기본 제공 기능이 없습니다.

가장 쉬운 방법은 자체 서명 된 인증서에 새 RSA 키를 래핑 한 다음 cert 키와 개인 키를 모두 .p12 파일에 넣는 것입니다.

대안은 수동으로 개인 키 파일/blob을 구문 분석하고 RSAParameters 구조를 작성하는 것입니다. 또는이를 위해 할 수있는 제 3 자 라이브러리를 사용하십시오.

+0

조언 해 주셔서 감사합니다. 이러한 옵션 중 하나를 어떻게 얻을 수 있습니까? 나는 친숙하지 않다. – FullStack

+1

자체 파싱은 적절한 RFC를 찾아 데이터 구조를 찾은 다음 DER을 디코딩해야합니다. 제 3 자 라이브러리는 꽤 넓은 영역입니다. 그러나 가장 쉬운 해결책은'openssl req -new -x509 -key rsakey.pem -out selfsigned.cer'입니다 (프롬프트가 표시되면 모든 기본값을 그대로 사용합니다). (그리고 .p12 생성에서'-nocerts'를'-in selfsigned.cer'로 대체하십시오). 그런 다음 cert에서'GetRSAPrivateKey()'또는'GetRSAPublicKey()'를 호출하십시오. – bartonjs

+0

다른 변형을 시도했지만, 마침내 작동합니다. 고맙습니다 – FullStack

0

P12 파일에 X509 인증서가 없기 때문에 X509Certificate2는 파일을 적절한 입력으로 해석하지 않습니다.

+0

정말 개인 키를 'RSACryptoServiceProvider' 개체로 사용하고 싶습니다. 어떻게하면 될까요? – FullStack

관련 문제