Skip to content

MS_OpenSSL

nishi_74322014 edited this page Aug 4, 2026 · 1 revision

OpenSSL

概要

  • SSL/TLS プロトコルの OSS。
  • C 言語で開発されているため、クロスプラットフォーム。

証明書操作

証明書生成から、色々な証明書操作が可能。

各種証明書操作

  • 秘密鍵の生成(*.key or *.pem

  • 証明書署名要求(*.csr)の生成
    証明書署名要求(CSR: Certificate Signing Request)

  • 証明書(*.crt, *.cer)の生成

    • 証明書(CRT: CERTIFICATE)
    • *.crt: Unix or Linux
    • *.cer: Windows
  • *.pfx の生成(*.pfx or *.pem

  • *.pfx から単離

    • 証明書(*.cer or *.pem
    • 秘密鍵(*.key or *.pem

移行メモ(正誤): 元 Wiki では *.pfx から単離できるものとして 「公開鍵*.key or *.pem)」と記載されていたが、 *.pfx(PKCS #12)から取り出すのは 秘密鍵である (公開鍵は証明書に含まれている)。 実際、後述のコマンドも -nocerts -nodes秘密鍵を取り出している。

なお、拡張子と中身の対応は以下のとおりで、拡張子は形式を保証しない。

拡張子 一般的な中身 エンコード
*.pem 証明書/鍵/CSR など何でも Base64(テキスト)
*.der 同上 バイナリ
*.crt / *.cer 証明書 PEM または DER
*.key 秘密鍵 PEM が多い
*.csr 証明書署名要求 PEM が多い
*.pfx / *.p12 証明書+秘密鍵(PKCS #12 バイナリ

pem化

バイナリ形式ファイルを pem 化できる。

デバッグ

  • 中身をダンプできるので、これを使ってデバッグできる。
  • これにより、X509CertificateX509Certificate2 等の問題を切り分けられる。

暗号化ライブラリ

ユーティリティに暗号化ライブラリを含む。

C言語

#include <openssl/evp.h>
#include <openssl/aes.h>

各言語

  • .NET Core on Linux
    下位が、CAPI(CSP)、CNG などではなく、OpenSSL プロバイダとなっている。
  • Java
    javax.crypto.* など。
  • Ruby
    OpenSSL::Cipher クラスなど。
  • PHP
    openssl_* 関数など。

移行メモ(正誤): 元 Wiki では PHP の例として 「Crypt::CBC モジュール」が挙げられていたが、 Crypt::CBCPerl のモジュールである。 PHP で OpenSSL を利用するのは openssl_encrypt 等の openssl 拡張の関数群である。

詳細

証明書操作(RSA)

基本

-in / -out を拡張子付きで明示することで制御した方がよい。

  • 入出力フォーマット

    • -inform DER|PEM|NET : 入力ファイルの書式
    • -outform DER|PEM|NET : 出力ファイルの書式
  • 入出力ファイル(デフォルトは標準入出力)

    • -in filename : 入力する証明書のファイル名を指定。
    • -out filename : 出力する証明書のファイル名を指定。
  • 出力方式

    • -text : テキスト形式で出力
    • -noout : (エンコードされた本体を)出力しない

移行メモ(補足): 元 Wiki には 「-inform / -outform は拡張子から自動判別する」とあるが、 OpenSSL は拡張子を見ない-inform を省略した場合の既定値は(多くのサブコマンドで)PEM であり、 DER を扱うときは明示が必要である。

*.pfx の生成

  • 秘密鍵の単品生成(最後の 2048 は鍵長)
openssl genrsa -out private-key.pem 2048
  • 証明書の単品生成。以下の 2 フェーズから成る。

    • 証明書署名要求(CSR: Certificate Signing Request)の生成
      最低限、「Common Name(CN)」さえ入力されていれば、通る。
openssl req -new -key private-key.pem > csr.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:.
State or Province Name (full name) [Some-State]:.
Locality Name (eg, city) []:.
Organization Name (eg, company) [Internet Widgits Pty Ltd]:.
Organizational Unit Name (eg, section) []:.
Common Name (e.g. server FQDN or YOUR name) []:x
Email Address []:.

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:.
An optional company name []:.
  • 証明書の生成
openssl x509 -in csr.csr -days 365000 -req -signkey private-key.pem > cer.cer
  • 秘密鍵と証明書から *.pfx を生成する。
openssl pkcs12 -export -out pfx.pfx -inkey private-key.pem -in cer.cer
Enter Export Password:
Verifying - Enter Export Password:

補足(最新化): サーバ証明書として使う場合、 現在のブラウザは Common Name(CN) を見ず、SAN(Subject Alternative Name) を要求する。 従って以下のように SAN を付与する必要がある。

openssl req -new -key private-key.pem -out csr.csr \
  -subj "/CN=example.local" \
  -addext "subjectAltName=DNS:example.local,DNS:www.example.local"
openssl x509 -req -in csr.csr -signkey private-key.pem -days 825 \
  -copy_extensions copy -out cer.cer

また、-days 365000(約 1000 年)は現実的でなく、 公開 CA の TLS 証明書は 398 日以内が上限である(自己署名でも 825 日程度が無難)。

なお、OpenSSL 3.x が生成する *.pfx は既定で AES ベースの暗号を使うため、 古い .NET / Windows で読めないことがある。その場合は -legacy を付ける。

*.cer に変換

*.pfx から、秘密鍵 or 証明書を出力する。

  • 秘密鍵の取り出し
openssl pkcs12 -in ca.pfx -nocerts -nodes -out ca.key
Enter Import Password:
MAC verified OK
  • 証明書の取り出し
openssl pkcs12 -in ca.pfx -clcerts -nokeys -out ca.cer
Enter Import Password:

*.pem に変換

  • *.pfx を pem に変換
    • pem の秘密鍵を暗号化する場合
openssl pkcs12 -in XXX.pfx -out XXX.pem
Enter Import Password:
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
  • pem の秘密鍵を暗号化しない場合
openssl pkcs12 -in pfx.pfx -out XXX.pem -nodes
Enter Import Password:
  • *.cer から公開鍵を pem で取り出す
openssl x509 -in XXX.cer -pubkey -noout -out XXX.pem

中身の確認(デバッグ)

openssl x509  -in cer.cer  -text -noout     # 証明書
openssl req   -in csr.csr  -text -noout     # CSR
openssl rsa   -in key.pem  -text -noout     # RSA 秘密鍵
openssl pkcs12 -in pfx.pfx -info -nodes     # PKCS #12
openssl s_client -connect example.com:443 -servername example.com   # 通信先の証明書

暗号化ライブラリ (.NET)

.NET Standard(MS_DotNetStandard.md)では、OpenSSL ベースのプロバイダも提供されている。

プロバイダ

以下のプロバイダが OpenSSL ベースのプロバイダとして提供されている。

  • RSAOpenSsl
  • DSAOpenSsl
  • ECDiffieHellmanOpenSsl
  • ECDsaOpenSsl

ネイティブ実装

NuGet で runtime.native.System.Security.Cryptography.OpenSsl を検索すると、
Linux ディストリビューション毎のネイティブ実装が確認できる
runtime.debian.* / runtime.ubuntu.* / runtime.rhel.* / runtime.fedora.* /
runtime.opensuse.* / runtime.osx.* など)。

補足(最新化): 上記のディストリビューション別ランタイム パッケージは .NET Core 2.0 世代の仕組みであり、 現在の .NET(.NET 5 以降)では不要になっている (システムにインストールされた OpenSSL を直接 P/Invoke する)。 また、*OpenSsl クラスを直接使うのではなく、 RSA.Create() などのファクトリを使えば プラットフォームに応じて CNG / OpenSSL が選択される。

その他の証明書

DSA証明書

  • DSA パラメタを生成
openssl dsaparam -out dsa.param 2048
  • 以下のコマンドで秘密鍵を生成
openssl gendsa -out private-key.pem dsa.param
  • 以降、*.pfx の生成の手順と同じ。

  • 通しで

openssl dsaparam -out dsa.param 2048
openssl gendsa -out private-key.pem dsa.param
openssl req -new -key private-key.pem > csr.csr
openssl x509 -in csr.csr -days 365000 -req -signkey private-key.pem > cer.cer
openssl pkcs12 -export -out pfx.pfx -inkey private-key.pem -in cer.cer

補足(最新化): DSA は TLS 1.3 で廃止されており、 現在の TLS サーバ証明書としては使えない。学習・検証用と考えたほうがよい。

ECDSA証明書

prime256v1 で CSR を作成する。
(現時点では、prime256v1, secp384r1, secp521r1 が各環境で使い物になるレベル)

  • インストールされている openssl で使える楕円曲線暗号の種類を確認する。
openssl ecparam -list_curves
  • 以下のコマンドで秘密鍵を生成
openssl ecparam -out private-key.pem -name prime256v1 -genkey
  • 以降、*.pfx の生成の手順と同じ。

  • 通しで

openssl ecparam -list_curves
openssl ecparam -out private-key.pem -name prime256v1 -genkey
openssl req -new -key private-key.pem > csr.csr
openssl x509 -in csr.csr -days 365000 -req -signkey private-key.pem > cer.cer
openssl pkcs12 -export -out pfx.pfx -inkey private-key.pem -in cer.cer

補足: prime256v1 は NIST P-256、secp384r1 は P-384 と同一である (名称が複数あるので注意)。 RSA 2048 と ECDSA P-256 は概ね同等の強度で、 ECDSA のほうが鍵・署名ともに小さく高速である。

SSLサーバ証明書 / SSLクライアント証明書

IIS の SSL 設定などを参照。

インストール

Windows では、以下のいずれかで導入する。

  • Windows Subsystem for Linux の OpenSSL を使う。
  • Git for Windows に同梱の openssl.exe を使う。
  • winget / Chocolatey 等でビルド済みバイナリを導入する。

参考


Tags: セキュリティ, 暗号化, 証明書, .NET Core, .NET Standard

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally