1

以下のNew-SelfSignedCertificateコマンドに匹敵する自己署名証明書を作成する簡単な方法があるかどうか不思議です(他のプロバイダもOKです)。私はP/Invokeのない.NETライブラリ、またはBouncy Castleなどの外部ライブラリを使用するか、アプリケーションからPowerShellを呼び出さないでください。外部ライブラリのない自己署名証明書を生成する

New-SelfSignedCertificate -DnsName $certificateName -CertStoreLocation $certificateStore -KeyExportPolicy Exportable -Provider "Microsoft Enhanced RSA and AES Cryptographic Provider" -NotAfter $certificateNotAfter 

私は最も簡単な選択肢はPowerShellを呼び出すか、これは外部の施設ずになんとかしない場合には、そのような弾む城としてNugetライブラリを用いることであろうと仮定しますか?証明書を構築する方法を十分に知っていれば、バイト配列テンプレートなどを作成し、X509Certificate2コンストラクタでそれを使用することが可能なように感じます。それはすぐに明らかになった平野.NETでこれを行うための良い方法はありません。

は、1つが

public X509Certificate2 GenerateCertificate(string fileName, string password, string subjectName, StoreName storeName, DateTime endDate, DateTime notAfter, string provider = "Microsoft Enhanced RSA and AES Cryptographic Provider") 
{ 
    //Could provider be taken from https://stackoverflow.com/questions/43474902/generate-self-signed-rsa-2048-sha-256-certificate-pfx-file-using-openssl?    
    var newCertificate = new X509Certificate2(fileName, password, X509KeyStorageFlags.Exportable); 

    /* 
     # The following creates a self-signed certificate with one year of running time. 
    $currentDate = Get-Date 
    $certificateEndDate = $currentDate.AddYears(1) 
    $certificateNotAfter = $certificateEndDate.AddYears(1) 

    $certificateName = "https://www.test.com/test" 
    $certificateStore = "Cert:\LocalMachine\My" 
    New-SelfSignedCertificate -DnsName $certificateName -CertStoreLocation $certificateStore -KeyExportPolicy Exportable -Provider "Microsoft Enhanced RSA and AES Cryptographic Provider" -NotAfter $certificateNotAfter 
    */ 
} 

<編集する必要があります表示されます。私が見つけた

さらにいくつかのオプション:

ブログ記事Creating Authority-Signed and Self-Signed Certificates in .NETスティーブSyfuhsと別のことでSOモノの拡張、Mono.Security won't set multiple KeyUsagesを使用して投稿してください。既に議論されている選択肢とは別に、これは「このようなもの」です。

+0

「PowerShellを呼び出さずに」PowerShellコードを提供しています。ポイントは? – Crypt32

+0

最後に達成したいことは? PSソリューションをお探しですか? –

+0

'System.ServiceModel'の内部に[SelfSignedCertificate](https://referencesource.microsoft.com/#System.ServiceModel/System/ServiceModel/Channels/SelfSignedCertificate.cs,c4320314fb74ebcc)クラスが隠れているようです。しかし、それは内部的なものなので、リフレクションやコードを複製する必要がありますが、その時点でP/Invokingを再度実行します。その存在によって、私は.NETでより直接的に作成するための簡単なアプローチはないと推測します。 –

答えて

7

リリースされた.NETのバージョンでは証明書を作成することはできません。

CertificateRequest(自己署名証明書、連鎖署名証明書、またはPKCS#10証明書/証明書署名を行うことができるAPI)を介して.NET Core 2.0(この機能はまだリリースされていませんが、リクエスト)。

PowerShellコマンドは三つ組み合わせている:

  • キー記憶域パラメータ(CSP)
  • 証明書作成
  • 証明書ストレージ(に証明書を追加する店舗)

をローカルホスト上のTLSサーバー認証に適した自己署名証明書を作成するには

X509Certificate2 certificate = null; 
var sanBuilder = new SubjectAlternativeNameBuilder(); 
sanBuilder.AddDnsName("localhost"); 

// 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=localhost", 
     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()); 

    DateTimeOffset now = DateTimeOffset.UtcNow; 
    certificate = certRequest.CreateSelfSigned(now, now.AddDays(365.25)); 
} 

この証明書には一時的な秘密鍵がありますが、現在ディスクには書き込まれていません。 PKX/PKCS#12として証明書(および秘密鍵)をエクスポートしてから、PersistKeySet(およびExportable、以後これを再インポートすることがこの時点で最も重要な賭けになります)あなたはそれを望みます)、インポートしたコピーを自分が選択したX509Storeに追加します。

キーストアプロバイダ(自分のケースではCAPI CSP)を気にかけたり、エクスポート/インポートを避けたい場合は、事前に保存されたキーを使用してキーストアを作成できます。

var cspParameters = new CspParameters(
    /* PROV_RSA_AES */ 24, 
    "Microsoft Enhanced RSA and AES Cryptographic Provider", 
    Guid.NewGuid().ToString()); 

using (RSA rsa = new RSACryptoServiceProvider(newRsaKeySize, cspParameters)) 

CNG:だから

CAPIとRSA.Create(newRsaKeySize)を交換したい

var keyParams = new CngKeyCreationParameters(); 
keyParams.Parameters.Add(
    new CngProperty(
     "Length", 
     BitConverter.GetBytes(newRsaKeySize), 
     CngPropertyOptions.Persist)); 

using (CngKey rsaKey = CngKey.Create(CngAlgorithm.RSA, Guid.NewGuid().ToString(), keyParams) 
using (RSA rsa = new RSACng(rsaKey)) 

そして、通常の方法でオープンX509Storeインスタンスに追加します。

証明書を構築する方法が分かっていれば、バイト配列テンプレートなどを作成してX509Certificate2コンストラクタで使用することができます。

真。しかし、ちょっとしたことが少し難しいです。 ASN.1(ITU-T X.680)、DER(ITU-T X.690)、X.509(RFC 5280またはITU-T X.509)のいずれかを学ぶ必要があります。秘密鍵と噛み合った証明書を作成したい場合は、PFX/PKCS#12(RFC 7292、ただしWin10のみの場合を除いて古いオプションのいくつかに限定されています)を学ぶ必要があり、これには前提条件知識も。

これらはすべて楽しいことだと知っておくべきことだと思うが、私の同僚はホワイトボードでDERを落書きし始めると奇妙な表情をするので、平均的な開発者意見"楽しい"の。

+0

これは私がずっとずっと来たことを超えて教育的です。これは真剣に良いことであり、おそらく今後数年間に多くの質問に答えます。私は本当にありがとう、あなたがこれを書くために取ったトラブルのため、感謝しています! – Veksi

関連する問題