2017-07-19 1 views
2

makecertに問題があり、件名の代替名を持つ自己署名入りのSSL証明書を生成できません(SAN)を配置します。 Google Chromeの最新バージョンでは、HTTPS経由でWebサイトにアクセスするとセキュリティエラーが発生します。私は文脈を試して理解するためにいくつかの記事を読んでおり、makecertは十分に古く、SANでX509 v3証明書の生成をサポートすることができないという結論に達しました。自己署名付きルート証明書とそのルートCAに基づく中間証明書を生成するための代替手段はありますか?Windows 7以上で実行可能な他のものを使用してください。自己署名証明書(Subject Alternative Nameを持つX509 v3)を自分のルート証明書で生成してMakeCert.exeを置き換える方法があります

次のようにルート証明書が生成され、次のようにルートCA以上と

makecert.exe -pe -ss Root -sr LocalMachine -n "CN=DIGITALMARKETRESEARCHAPPS PTY LTD, O=DIGITALMARKETRESEARCHAPPS PTY LTD, OU=DIGITALMARKETRESEARCHAPPS PTY LTD" -eku 1.3.6.1.5.5.7.3.1 -r -cy authority -a sha256 

中間証明書が作成されます。

makecert.exe -pe -ss my -n "CN=www.myawesomesite.com.au, O=DIGITALMARKETRESEARCHAPPS PTY LTD, OU=DIGITALMARKETRESEARCHAPPS PTY LTD" -sky exchange -in "DIGITALMARKETRESEARCHAPPS PTY LTD" 

私はNew-SelfsignedCertificateExまたはNew-SelfSignedCertificateのいずれかを使用する方法を見つけるように見えることはできません上記のパラメータに正確にマッピングし、指定されたルートCAを使用して証明書を作成します。

本当にありがとうございます、正しい方向に助けてください。

現時点では、makecert.exeを利用してクライアントが使用するこの古いアプリケーションがあり、その場でSSL証明書を生成します。残念なことに、これはずっと前に行われたもので、今のところ全体のアーキテクチャを変更するように戻って彼らに伝えるのは難しいです。特にGoogleのXhromeは、以下のこの記事で説明したようにmakecertによって生成されたこれらの証明書文句を言ってきた:

http://news.thewindowsclub.com/deprecation-coming-to-google-chrome-heres-how-it-could-affect-your-workflow-88723/

http://www.telerik.com/blogs/understanding-fiddler-certificate-generators

+1

あなたがopenssl.exe' 'でそれをすべて行うことができます。オフトピック。 – EJP

+0

New-SelfSignedCertificate PowerShellコマンドレットですべて実行できます。 – Crypt32

+0

おかげさまでEJPとCrypt32に感謝します。私はopensslについての記事を読んだが、この文脈ではパッケージ化されたmakecert.exeを別の実行可能ファイルに置き換えるか、あるいは私が一緒に配布できるようにする必要がある。 基本的には次のようになります: アプリケーション - > HTTPS要求を検査するためにfiddlerコアを使用します - > makecert.exe を呼び出してprocessinfoを使用して外部プロセスを起動し、ルート証明書とエンドエンティティ証明書を作成します。 私はNew-SelfSignedCertificateを試しましたが、信頼の連鎖を作成することができず、すべてのパラメータがWindows 7および8,8.1で動作するわけではありません –

答えて

1

.NETコア2.0の次期リリースは、ここに助けるために新しいクラスを追加しました。 「powershell can」または「powershellのバージョンがある」ことはわかっていますが、.NET Coreで動作する方法はわかりません。この答えに必要なアダプタがあるかもしれません。考えるsigningCert

HasPrivateKey==true X509Certificate2インスタンス:

private static X509Certificate2 CreateNewCertificate(
    X509Certificate2 signingCert, 
    int newRsaKeySize, 
    IEnumerable<string> sanDnsEntries) 
{ 
    var sanBuilder = new SubjectAlternativeNameBuilder(); 
    string primaryDnsName = null; 

    foreach (string dnsEntry in sanDnsEntries) 
    { 
     // Let's just use the first one as the subject. 
     primaryDnsName = primaryDnsName ?? dnsEntry; 

     sanBuilder.AddDnsName(dnsEntry); 
    } 

    // New .NET Core Create(int) method. Or use 
    // rsa = RSA.Create(), rsa.KeySize = newRsaKeySize, 
    // or (on .NET Framework) new RSACng(newRsaKeySize) 
    using (RSA rsa = RSA.Create(newRsaKeySize)) 
    { 
     var certRequest = new CertificateRequest(
      $"CN={primaryDnsName}, O=Et OU=Cetera", 
      rsa, 
      HashAlgorithmName.SHA256, 
      RSASignaturePadding.Pkcs1); 

     // Explicitly not a CA. 
     certRequest.CertificateExtensions.Add(
      new X509BasicConstraintsExtension(false, false, 0, false)); 

     certRequest.CertificateExtensions.Add(
      new X509KeyUsageExtension(
       X509KeyUsageFlags.DigitalSignature | X509KeyUsageFlags.KeyEncipherment, 
       true)); 

     // TLS Server EKU 
     certRequest.CertificateExtensions.Add(
      new X509EnhancedKeyUsageExtension(
       new OidCollection 
       { 
        new Oid("1.3.6.1.5.5.7.3.1"), 
       }, 
       false)); 

     // Add the SubjectAlternativeName extension 
     certRequest.CertificateExtensions.Add(sanBuilder.Build()); 

     // Serial number. 
     // It needs to be unique per issuer. 
     // CA/Browser forum rules say 64 or more bits must come from a CSPRNG. 
     // RFC 3280 says not to use more than 20 bytes. 
     // Let's use 16 (two C# `long`s) 
     byte[] serialNumber = new byte[16]; 

     using (RandomNumberGenerator rng = RandomNumberGenerator.Create()) 
     { 
      rng.GetBytes(serialNumber); 
     } 

     // If you care about monotonicity (and believe your clock is monotonic enough): 
     { 
      long ticks = DateTime.UtcNow.Ticks; 
      byte[] tickBytes = BitConverter.GetBytes(ticks); 

      if (BitConverter.IsLittleEndian) 
      { 
       Array.Reverse(tickBytes); 
      } 

      Buffer.BlockCopy(tickBytes, 0, serialNumber, 0, tickBytes.Length); 
     } 

     DateTimeOffset now = DateTimeOffset.UtcNow; 

     return certRequest.Create(
      signingCert, 
      now, 
      now.AddDays(90), 
      serialNumber); 
    } 
} 

API Documentation

関連する問題