2013-07-18 9 views
1

나는이 문제에 대해 조언 해 주셔서 고맙게 여기며 나를 미워하고 문서를 찾을 수 없습니다. 현재 C#에서 특정 요구 사항 (RSA 2048, SHA256 등)을 충족하는 모노 보안 API를 사용하여 자체 서명 된 루트 인증서를 생성하려고합니다. 나는이 모든 요구 사항 하나를 만족하는 인증서를 성공적으로 생성 할 수있었습니다. 나는 이러한 확장을 생성하는 내가 가지고 있기 때문에 가능하다 알고C#에서 Mono Security API를 사용하여 인증서 정책 확장 생성

private void GenerateRootCertMono(RSACryptoServiceProvider rsa, byte[] serialNumber, string password) 
    { 
     // default values 
     string subject = "CN= company name"; 
     string issuer = "CN=company name"; 
     DateTime notBefore = DateTime.Now; 
     DateTime notAfter = new DateTime(643445675990000000); // 12/31/2039 23:59:59Z 


     X509CertificateBuilder cb = new X509CertificateBuilder(3); 
     cb.SerialNumber = serialNumber; 
     cb.IssuerName = issuer; 
     cb.NotBefore = notBefore; 
     cb.NotAfter = notAfter; 
     cb.SubjectName = subject; 
     cb.SubjectPublicKey = rsa; 
     // extensions 
     BasicConstraintsExtension bce = new BasicConstraintsExtension(); 
     bce.CertificateAuthority = true; 
     cb.Extensions.Add(bce); 
     KeyUsageExtension kue = new KeyUsageExtension(); 
     kue.KeyUsage = KeyUsages.digitalSignature ; 

     KeyUsageExtension kue1 = new KeyUsageExtension(); 
     kue1.KeyUsage = KeyUsages.keyCertSign; 

     //my failed attempt to generate a simple Certificate Policy Extension 
     **ASN1 a = new ASN1(); 
     a.Add(ASN1Convert.FromOid("2.5.29.32")); 
     a.Add(ASN1Convert.FromOid("some oid")); 
     a.Add(new ASN1 (System.Text.Encoding.ASCII.GetBytes("some text"))); 
     CertificatePoliciesExtension pce = new CertificatePoliciesExtension(a); 


     cb.Extensions.Add(pce); 
     cb.Extensions.Add(kue); 
     cb.Extensions.Add(kue1); 
    // signature 
     cb.Hash = "SHA256"; 
     byte[] rawcert = cb.Sign(rsa); 
     X509Certificate2 pfx = new X509Certificate2(rawcert); 
     pfx.PrivateKey = rsa; 
     this.PFX = pfx.Export(X509ContentType.Pkcs12, password); 
     return; 
    } 

:

나는 이러한 확장은 일반적으로 포맷되어 CertificatePoliciesExtension를 추가하려고은

[4]: ObjectId: 2.5.29.32 Criticality=false 
CertificatePolicies [ 
[CertificatePolicyId: [some policy oid] 
    [PolicyQualifierInfo: 
     [qualifierID: some qualifier oid 
     qualifier: some ascii encoded byte stream]]]] 

내 코드는 다음과 같습니다 X509 인증서에서에서 다음과 그 (것)들을 다른 증명서에서 보았다. 누구든지 어떤 경험이나 조언을 가지고 있습니까? 또한 MSCAPI를 사용하여 C#에서 논문 확장을 생성하는 방법을 알고있는 사람이 받아 들일 수있는 솔루션이기도 한 경우 API를 사용하여 융통성을 발휘합니다. 사전에 도움을 주셔서 감사합니다.

답변

1

여러 소스를 수색 한 후에 Mono에서 Microsoft의 certenroll.dll로 전환하여이 문제를 해결할 수있었습니다. Policy Extensions로 자체 서명 된 인증서를 생성하는 코드는 다음과 같습니다. 희망이 비슷한 문제가 누구나 도움이됩니다.

코드는 다음 참조를 기반으로합니다. http://technet.microsoft.com/en-us/library/ff182332(v=ws.10).aspx.

public X509Certificate2 CreateSelfSignedCert(string subject,string password,DateTime expDate) 
    { 
     // create DN for subject and issuer 
     var dn = new CX500DistinguishedName(); 
     // dn.Encode("CN=" + subject, X500NameFlags.XCN_CERT_NAME_STR_NONE); 
     dn.Encode(subject, X500NameFlags.XCN_CERT_NAME_STR_NONE); 

     // create a new private key for the certificate 
     CX509PrivateKey privateKey = new CX509PrivateKey(); 
     privateKey.ProviderName = "Microsoft Base Cryptographic Provider v1.0"; 
     privateKey.MachineContext = true; 
     privateKey.Length = 2048; 
     privateKey.KeySpec = X509KeySpec.XCN_AT_SIGNATURE; // use is not limited 
     privateKey.ExportPolicy 
      = X509PrivateKeyExportFlags.XCN_NCRYPT_ALLOW_PLAINTEXT_EXPORT_FLAG; 
     privateKey.Create(); 

     // Use Sha256 hashing algorithm 
     var hashobj = new CObjectId(); 
     hashobj.InitializeFromAlgorithmName(
      ObjectIdGroupId.XCN_CRYPT_HASH_ALG_OID_GROUP_ID, 
      ObjectIdPublicKeyFlags.XCN_CRYPT_OID_INFO_PUBKEY_ANY, 
      AlgorithmFlags.AlgorithmFlagsNone, 
      "SHA256"); 

     // Create the self signing request 
     var cert = new CX509CertificateRequestCertificate(); 
     cert.InitializeFromPrivateKey(
      X509CertificateEnrollmentContext.ContextMachine, 
      privateKey, 
      string.Empty); 

     cert.Subject = dn; 
     cert.Issuer = dn; // the issuer and the subject are the same 
     cert.NotBefore = DateTime.Now; 
     cert.NotAfter = expDate; 
     cert.HashAlgorithm = hashobj; 

     // extensions 
     CX509ExtensionKeyUsage ku = new CX509ExtensionKeyUsage(); 
     ku.InitializeEncode(CERTENROLLLib.X509KeyUsageFlags.XCN_CERT_KEY_CERT_SIGN_KEY_USAGE | CERTENROLLLib.X509KeyUsageFlags.XCN_CERT_DIGITAL_SIGNATURE_KEY_USAGE); 
     ku.Critical = true; 
     cert.X509Extensions.Add((CX509Extension)ku); 

     CX509ExtensionBasicConstraints bc = new CX509ExtensionBasicConstraints(); 
     bc.InitializeEncode(true,0); 
     bc.Critical = false; 
     cert.X509Extensions.Add((CX509Extension)bc); 


     // Add the certificate policy. 
     CObjectId cpOid = new CObjectId(); 
     cpOid.InitializeFromValue("some oid"); 
     CCertificatePolicy cp = new CCertificatePolicy(); 
     CPolicyQualifier Qualifier = new CPolicyQualifier(); 
     Qualifier.InitializeEncode("Policy Notice", PolicyQualifierType.PolicyQualifierTypeUserNotice); 
     cp.Initialize(cpOid); 
     cp.PolicyQualifiers.Add(Qualifier); 
     CCertificatePolicies cps = new CCertificatePolicies(); 
     cps.Add(cp); 
     CX509ExtensionCertificatePolicies cpExt = new CX509ExtensionCertificatePolicies(); 
     cpExt.InitializeEncode(cps); 
     cert.X509Extensions.Add((CX509Extension)cpExt); 



     // Do the final enrollment process 
     var enroll = new CX509Enrollment(); 
     enroll.InitializeFromRequest(cert); // load the certificate 
     string csr = enroll.CreateRequest(); // Output the request in base64 
     // and install it back as the response 
     enroll.InstallResponse(InstallResponseRestrictionFlags.AllowUntrustedCertificate, 
      csr, EncodingType.XCN_CRYPT_STRING_BASE64, ""); // no password 
     // output a base64 encoded PKCS#12 so we can import it back to the .Net security classes 
     var base64encoded = enroll.CreatePFX("", PFXExportOptions.PFXExportChainWithRoot); 

     // instantiate the target class with the PKCS#12 data (and the empty password) 
     return new System.Security.Cryptography.X509Certificates.X509Certificate2(
      System.Convert.FromBase64String(base64encoded), "", 
      // mark the private key as exportable 
      System.Security.Cryptography.X509Certificates.X509KeyStorageFlags.Exportable 
     ); 

    }