C#でX509のpfx形式の自己証明書を作成する

C#でpfx形式の自己証明書を作成するコードを紹介します。

概要

pfx形式の証明書を作成する一般的な方法は、OpenSSLをインストールして作成する方法がありますが、 C#のプログラムで作成する方法もあります。この記事では、C#のプログラムでpfx形式の事故証明書を作成するコードを紹介します。

プログラム例

Windows Formアプリケーションを作成します。

UI

下図のフォームを作成します。
テキストボックスを3つ、複数行のテキストボックスを1つ、ボタンを1つ、SaveFileDialogを1つ配置しています。
C#でX509のpfx形式の自己証明書を作成する:画像1

コード

以下のコードを記述します。

using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography;

namespace CreateCertificate
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      // 鍵ペアを生成
      RSA rsa = RSA.Create(2048);
 
      // 証明書の要求を作成
      string cnName = "cn=" + textBox_CNDomain.Text;
      CertificateRequest request = new CertificateRequest(cnName, rsa, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);

      // 証明書の有効期間を設定
      DateTimeOffset notBefore = DateTimeOffset.UtcNow;
      DateTimeOffset notAfter = notBefore.AddYears(1);

      // 証明書を自己署名で作成
      X509Certificate2 certificate = request.CreateSelfSigned(notBefore, notAfter);

      // PFXファイルにエクスポート
      string Password = textBox_Password.Text;
      byte[] pfxBytes = certificate.Export(X509ContentType.Pfx, Password);

      // PFXファイルを保存
      File.WriteAllBytes(textBox_FileName.Text, pfxBytes);

      textBox_Output.Text += "PFXファイルが作成されました。";

    }

    private void button2_Click(object sender, EventArgs e)
    {
      if (saveFileDialog1.ShowDialog() == DialogResult.OK) {
        textBox_FileName.Text = saveFileDialog1.FileName;
      }
    }
  }
}

解説

2048ビット長のRSA鍵ペアを作成します。

  RSA rsa = RSA.Create(2048);


証明書要求を作成します。cn名はテキストボックスに入力されたドメイン名を利用します。 証明書要求の作成の詳細についてはこちらの記事も参照してください。

  string cnName = "cn=" + textBox_CNDomain.Text;
  CertificateRequest request = new CertificateRequest(cnName, rsa, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);


証明書の有効期間の日付を設定します。今回は1年としています。

  DateTimeOffset notBefore = DateTimeOffset.UtcNow;
  DateTimeOffset notAfter = notBefore.AddYears(1);

X509証明書を自己署名で作成します。

  X509Certificate2 certificate = request.CreateSelfSigned(notBefore, notAfter);


作成した証明書をエクスポートしてバイト配列を取得します。パスワードはエクスポートの際に設定します。

  string Password = textBox_Password.Text;
  byte[] pfxBytes = certificate.Export(X509ContentType.Pfx, Password);


証明書をファイルに保存し、メッセージを出力します。

  File.WriteAllBytes(textBox_FileName.Text, pfxBytes);

  textBox_Output.Text += "PFXファイルが作成されました。";

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。
C#でX509のpfx形式の自己証明書を作成する:画像2

保存先のパスやドメイン名を設定し、[証明書の作成]ボタンをクリックします。 証明書が作成され"PFXファイルが作成されました"のメッセージがテキストボックスに表示されます。
C#でX509のpfx形式の自己証明書を作成する:画像3

保存先のディレクトリに証明書ファイルが作成されています。
C#でX509のpfx形式の自己証明書を作成する:画像4

証明書を開いて内容を確認します。自己署名の証明書のため、ルート証明書が設定されていないことが確認できます。
C#でX509のpfx形式の自己証明書を作成する:画像5 C#でX509のpfx形式の自己証明書を作成する:画像6 C#でX509のpfx形式の自己証明書を作成する:画像7

X509のpfx形式の自己証明書を作成できました。

メモ
ルート証明書(CA)のある証明書を作成するには、win-acme (Let's Encrypt) を利用する方法があります。 win-acmeでpfx形式の証明書を作成する方法はこちらの記事を参照してください。


AuthorPortraitAlt
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
作成日: 2024-12-17
Copyright © 1995–2025 iPentec all rights reserverd.