2014-02-18 2 views
2

나는 그러나 그것이 생각만큼 쉽지 판명하지 않았다 C 번호에이 줄을로그인 파일을 사용하여 .NET의 OpenSSL이 래퍼

openssl smime -sign -signer <chain_crt_file> -in <infile> -out <outfile> -inkey <privatekey> -outform der 

을 복사하려고했다. 지금까지 나는이 시점에만왔다.

OpenSSL.Core.BIO crtBio = OpenSSL.Core.BIO.File("C:/asl/chain.crt", "r"); 
OpenSSL.Core.BIO keyBio = OpenSSL.Core.BIO.File("C:/asl/keydec.txt", "r"); 
OpenSSL.X509.X509Chain crt = new OpenSSL.X509.X509Chain(crtBio); 
OpenSSL.Crypto.RSA key = OpenSSL.Crypto.RSA.FromPrivateKey(keyBio); 

String str = "test"; 
byte[] bytes = new byte[str.Length * sizeof(char)]; 
System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length); 

어디에서 (잘하면) 체인 인증서와 복호화 된 개인 키를 가져오고있다. 이제는 파일에 서명하고 내보내기가 DER입니다. OpenSSL.NET wrapper에는 인터넷에있는 문서와 예제가 없습니다. '공개/개인 키를 사용하여 메시지를 암호화하고 암호를 해독하는 방법'은 여기에 해당하지 않습니다.

시작하려면이 "테스트"문자열에 서명을 시도해야합니다 (파일을 안으로/밖으로 꽤 직선적이어야합니다). 그러나 시작할 수있는 단서가 없습니다.

내가 기호이 필요하므로이 키와 인증서 체인이 모두 필요합니다.

도움을 주셔서 감사합니다.

+1

OpenSSL 래퍼가 필요합니까? 개인 키 및 [SignedCms .Net 클래스] (http://msdn.microsoft.com/ru-ru/library/yeth51c4 (v = vs.110) .aspx)를 사용하여 x509 인증서를 사용하여 모든 데이터에 서명 할 수 있습니다. 7.12 RSA 개인 키를 사용하여 데이터 서명 "http://etutorials.org? – oleksa

+0

참조 해 주셔서 감사합니다. .NET Cryptography 클래스에서 완벽하게 지원되므로 사용자의 제안을 따르고 PKCS12 파일을 사용했을 때 분명히 래퍼가 필요하지 않았습니다. 내가 찾은 해결책은 매우 쉽습니다. http://stackoverflow.com/questions/11526572/openssl-smime-in-c-sharp?rq=1 – Mike

답변

0

시작하려면이 "테스트"문자열에 서명을 시도했는데 (파일 입출력이 꽤 직선이어야 함) 시작하는 데는 단서가 없습니다.

아마도 OpenSSL 소스를 시작하는 것이 좋습니다. OpenSSL은 smime의 소스를 <openssl dir>/apps/smime.c에 제공합니다.

OpenSSL의 smime 유틸리티는 적절한 매개 변수를 사용하여 PKCS7_sign을 호출합니다. 라인 688 주위에서 :

else if (operation & SMIME_SIGNERS) 
    { 
    int i; 
    /* If detached data content we only enable streaming if 
    * S/MIME output format. 
    */ 
    if (operation == SMIME_SIGN) 
     { 
     if (flags & PKCS7_DETACHED) 
      { 
      if (outformat == FORMAT_SMIME) 
       flags |= PKCS7_STREAM; 
      } 
      else if (indef) 
       flags |= PKCS7_STREAM; 

      flags |= PKCS7_PARTIAL; 
      p7 = PKCS7_sign(NULL, NULL, other, in, flags); 
      if (!p7) 
       goto end; 
     } 
     ... 

PKCS7_sign의 지식으로, 당신은 PKCS7_sign(3)에 OpenSSL이의 문서를 방문 할 수 있습니다. 또는 예제를 사냥 할 수 있습니다.

사용중인 래퍼에 대해 알지 못합니다.

+0

그 래퍼에는 불행히도 PCKS7 객체가 작동하지 않을 것입니다. 어쨌든 고마워. – Mike

+0

@Mike - CMS 래퍼를 제공합니까? OpenSSL을 사용하여 고양이를 피하는 또 다른 방법이라고 생각합니다. – jww