-
Notifications
You must be signed in to change notification settings - Fork 0
MS_OpenSSL
- 戻る(証明書、SSL/TLS、.NETの署名・暗号化アルゴリズム)
- OpenSSL
- PKI(公開鍵暗号基盤)
- 暗号化アルゴリズム
- SSL/TLS プロトコルの OSS。
- C 言語で開発されているため、クロスプラットフォーム。
証明書生成から、色々な証明書操作が可能。
-
秘密鍵の生成(
*.keyor*.pem) -
証明書署名要求(
*.csr)の生成
証明書署名要求(CSR: Certificate Signing Request) -
証明書(
*.crt,*.cer)の生成- 証明書(CRT: CERTIFICATE)
-
*.crt: Unix or Linux -
*.cer: Windows
-
*.pfxの生成(*.pfxor*.pem) -
*.pfxから単離- 証明書(
*.ceror*.pem) - 秘密鍵(
*.keyor*.pem)
- 証明書(
移行メモ(正誤): 元 Wiki では
*.pfxから単離できるものとして 「公開鍵(*.keyor*.pem)」と記載されていたが、*.pfx(PKCS #12)から取り出すのは 秘密鍵である (公開鍵は証明書に含まれている)。 実際、後述のコマンドも-nocerts -nodesで秘密鍵を取り出している。なお、拡張子と中身の対応は以下のとおりで、拡張子は形式を保証しない。
拡張子 一般的な中身 エンコード *.pem証明書/鍵/CSR など何でも Base64(テキスト) *.der同上 バイナリ *.crt/*.cer証明書 PEM または DER *.key秘密鍵 PEM が多い *.csr証明書署名要求 PEM が多い *.pfx/*.p12証明書+秘密鍵(PKCS #12) バイナリ
バイナリ形式ファイルを pem 化できる。
- 中身をダンプできるので、これを使ってデバッグできる。
- これにより、
X509Certificate、X509Certificate2等の問題を切り分けられる。
ユーティリティに暗号化ライブラリを含む。
#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::CBCは Perl のモジュールである。 PHP で OpenSSL を利用するのはopenssl_encrypt等の openssl 拡張の関数群である。
-in / -out を拡張子付きで明示することで制御した方がよい。
-
入出力フォーマット
-
-inform DER|PEM|NET: 入力ファイルの書式 -
-outform DER|PEM|NET: 出力ファイルの書式
-
-
入出力ファイル(デフォルトは標準入出力)
-
-in filename: 入力する証明書のファイル名を指定。 -
-out filename: 出力する証明書のファイル名を指定。
-
-
出力方式
-
-text: テキスト形式で出力 -
-noout: (エンコードされた本体を)出力しない
-
移行メモ(補足): 元 Wiki には 「
-inform/-outformは拡張子から自動判別する」とあるが、 OpenSSL は拡張子を見ない。-informを省略した場合の既定値は(多くのサブコマンドで)PEMであり、 DER を扱うときは明示が必要である。
- 秘密鍵の単品生成(最後の 2048 は鍵長)
openssl genrsa -out private-key.pem 2048
-
証明書の単品生成。以下の 2 フェーズから成る。
- 証明書署名要求(CSR: Certificate Signing Request)の生成
最低限、「Common Name(CN)」さえ入力されていれば、通る。
- 証明書署名要求(CSR: Certificate Signing Request)の生成
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を付ける。
*.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:
-
*.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 Standard(MS_DotNetStandard.md)では、OpenSSL ベースのプロバイダも提供されている。
以下のプロバイダが OpenSSL ベースのプロバイダとして提供されている。
RSAOpenSslDSAOpenSslECDiffieHellmanOpenSslECDsaOpenSsl
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 パラメタを生成
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 サーバ証明書としては使えない。学習・検証用と考えたほうがよい。
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 のほうが鍵・署名ともに小さく高速である。
IIS の SSL 設定などを参照。
Windows では、以下のいずれかで導入する。
- Windows Subsystem for Linux の OpenSSL を使う。
- Git for Windows に同梱の
openssl.exeを使う。 - winget / Chocolatey 等でビルド済みバイナリを導入する。
Tags: セキュリティ, 暗号化, 証明書, .NET Core, .NET Standard
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。