「OpenSSL」の版間の差分
Kusanaginoturugi (トーク | 投稿記録) (序文を修正) |
Kusanaginoturugi (トーク | 投稿記録) (→一つのコマンドで自己証明証明書と秘密鍵を生成: 記事を追加) |
||
(2人の利用者による、間の20版が非表示) | |||
1行目: | 1行目: | ||
− | [[Category: |
+ | [[Category:トランスポート層セキュリティ]] |
[[en:OpenSSL]] |
[[en:OpenSSL]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
7行目: | 7行目: | ||
[http://www.openssl.org OpenSSL] は SSL と TLS プロトコルのオープンソース実装で、可能な限り柔軟になるように設計されています。BSD, Linux, OpenVMS, Solaris, Windows などの様々なプラットフォームをサポートしています。 |
[http://www.openssl.org OpenSSL] は SSL と TLS プロトコルのオープンソース実装で、可能な限り柔軟になるように設計されています。BSD, Linux, OpenVMS, Solaris, Windows などの様々なプラットフォームをサポートしています。 |
||
+ | == インストール == |
||
− | {{Warning|2015年5月に公開された、OpenSSL のプロトコルの利用に関する共同研究によって、SSL 接続に "Logjam" 攻撃と呼ばれる、さらなる危険が存在することが判明しました。結果については https://weakdh.org/ を、推奨されるサーバー側の設定の変更については https://weakdh.org/sysadmin.html を見て下さい。}} |
||
+ | {{Pkg|openssl}} は {{Pkg|coreutils}} の依存関係として、デフォルトで Arch Linux にインストールされます。 |
||
− | == Installation == |
||
+ | 開発者向けに様々な OpenSSL ライブラリのバインディングが用意されています。 |
||
− | {{Pkg|openssl}} is installed by default on Arch Linux (as a dependency of {{Pkg|coreutils}}). |
||
− | |||
− | There are various OpenSSL library bindings available for developers: |
||
* {{Pkg|python-pyopenssl}} |
* {{Pkg|python-pyopenssl}} |
||
21行目: | 19行目: | ||
* {{Pkg|haskell-openssl-streams}} |
* {{Pkg|haskell-openssl-streams}} |
||
− | == |
+ | == 設定 == |
− | + | Arch Linux では {{ic|OPENSSLDIR}} は {{ic|/etc/ssl}} です。 |
|
+ | OpenSSL 設定ファイルは、慣習的に {{ic|/etc/ssl/openssl.cnf}} に置かれ、最初は複雑に見えるかもしれません。シェルスクリプトの動作と同じように、変数が代入で展開されることがあることを覚えておいてください。設定ファイルの形式についての詳しい説明は、{{man|5ssl|config}} を参照してください。 |
||
− | The OpenSSL configuration file, conventionally placed in {{ic|/etc/ssl/openssl.cnf}}, may appear complicated at first. Remember that variables may be expanded in assignments, much like how shell scripts work. For a thorough explanation of the configuration file format, see {{man|5ssl|config}}. |
||
− | === req |
+ | === req セクション === |
+ | キー、要求、および自己署名証明書の生成に関連する設定。 |
||
− | {{Merge|#Generate a certificate signing request|Same topic.|section=Plan}} |
||
+ | req セクションは DN プロンプトを担当する。一般的な誤解として、''Common Name'' (CN) プロンプトがあり、これはユーザーの固有名詞を値として持つべきであると示唆するものです。エンドユーザー証明書は CN として '''マシンのホスト名''' を持つ必要があり、一方 CA は有効な TLD を持つべきではありません。これは、認証されたエンドユーザーの CN と CA 証明書の組み合わせの中で、あるソフトウェアがエンドユーザー証明書は自己署名されていると誤認する可能性のある組み合わせが存在しないようにするためです。CA 証明書の中には、[https://www.equifax.com Equifax] のように、CN を持たないものもあります。 |
||
− | Settings related to generating keys, requests and self-signed certificates. |
||
− | |||
− | The req section is responsible for the DN prompts. A general misconception is the ''Common Name'' (CN) prompt, which suggests that it should have the user's proper name as a value. End-user certificates need to have the '''machine hostname''' as CN, whereas CA should ''not'' have a valid TLD, so that there is no chance that, between the possible combinations of certified end-users' CN and the CA certificate's, there is a match that could be misinterpreted by some software as meaning that the end-user certificate is self-signed. Some CA certificates do not even have a CN, such as [https://www.equifax.com Equifax]: |
||
{{hc|$ openssl x509 -subject -noout < /etc/ssl/certs/Equifax_Secure_CA.pem|2= |
{{hc|$ openssl x509 -subject -noout < /etc/ssl/certs/Equifax_Secure_CA.pem|2= |
||
39行目: | 35行目: | ||
}} |
}} |
||
− | == |
+ | == 使用方法 == |
− | + | この章は、[[Transport Layer Security#証明書を取得]]を読んだ事を前提としています。 |
|
− | === |
+ | === Curve25519 秘密鍵を生成 === |
− | $ openssl genpkey -algorithm x25519 -out '' |
+ | $ openssl genpkey -algorithm x25519 -out ''filename'' |
− | === |
+ | === ECDSA 秘密鍵を生成 === |
− | $ openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out '' |
+ | $ openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out ''filename'' |
− | === |
+ | === RSA 秘密鍵を生成 === |
+ | ''genrsa'' に取って代わる({{man|1ssl|openssl}} によると)、{{man|1ssl|genpkey}} を使用。 |
||
− | With {{man|1ssl|genpkey}}, which supersedes ''genrsa'' according to {{man|1ssl|openssl}}: |
||
− | $ openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:''keysize'' -out '' |
+ | $ openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:''keysize'' -out ''filename'' |
+ | 暗号化された鍵が必要な場合は、{{ic|-aes-256-cbc}} オプションを使用します。 |
||
− | If an encrypted key is desired, use the {{ic|-aes-256-cbc}} option. |
||
+ | === 証明書署名要求を生成 === |
||
− | === Generate a certificate signing request === |
||
− | + | {{man|1ssl|req}} を使用。 |
|
$ openssl req -new -sha256 -key ''private_key'' -out ''filename'' |
$ openssl req -new -sha256 -key ''private_key'' -out ''filename'' |
||
+ | === 証明書署名リクエストを表示 === |
||
− | === Generate a self-signed certificate === |
||
+ | |||
+ | 証明書署名リクエストはエンコードされた形式で保存されます。リクエストを人間が読める形式で表示するには: |
||
+ | |||
+ | $ openssl req -noout -text -in ''filename'' |
||
+ | |||
+ | === 自己証明証明書を生成 === |
||
$ openssl req -key ''private_key'' -x509 -new -days ''days'' -out ''filename'' |
$ openssl req -key ''private_key'' -x509 -new -days ''days'' -out ''filename'' |
||
+ | === 一つのコマンドで自己証明証明書と秘密鍵を生成 === |
||
− | === Generate a self-signed certificate with private key in a single command === |
||
+ | OpenSSL では、上記のコマンドを 1 つにまとめることができるので、場合によっては便利かもしれません。 |
||
− | You can combine the above command in OpenSSL into a single command which might be convenient in some cases: |
||
$ openssl req -x509 -newkey rsa:4096 -days ''days'' -keyout ''key_filename'' -out ''cert_filename'' |
$ openssl req -x509 -newkey rsa:4096 -days ''days'' -keyout ''key_filename'' -out ''cert_filename'' |
||
+ | === CA 証明書による証明書署名要求への署名 === |
||
− | === Generate Diffie–Hellman parameters === |
||
+ | $ openssl x509 -req -in ''cert_req_filename'' -days ''days'' -CA ''CA_cert'' -CAkey ''CA_cert_private_key'' -CAserial ''CA_cert_serial_file'' -out ''cert_out'' |
||
− | See [[Wikipedia:Diffie–Hellman key exchange|Diffie–Hellman key exchange]] for more information. |
||
+ | === ディフィー・ヘルマン パラメーターを生成 === |
||
− | Current [[MozillaWiki:Security/Server Side TLS|best practice]] is to use one of the standard DH groups from RFC 7919, eg. [https://ssl-config.mozilla.org/ffdhe2048.txt ffdhe2048]. |
||
+ | 詳細については、[[Wikipedia:ja:ディフィー・ヘルマン鍵共有|ディフィー・ヘルマン鍵共有]]を参照してください。 |
||
− | Alternatively you can generate a random group of your own: |
||
+ | |||
+ | 現在の[[MozillaWiki:Security/Server Side TLS|ベストプラクティス]]は、RFC 7919の標準的なDHグループの1つ、例えば [https://ssl-config.mozilla.org/ffdhe2048.txt ffdhe2048] を使用することです。 |
||
+ | |||
+ | あるいは、自分でランダムなグループを生成することもできます。 |
||
$ openssl dhparam -out ''filename'' ''2048'' |
$ openssl dhparam -out ''filename'' ''2048'' |
||
− | {{Tip| |
+ | {{Tip|特にハイエンドのハードウェアでない場合、生成を高速化するには、{{ic|-dsaparam}} オプションを追加します[https://security.stackexchange.com/questions/95178/diffie-hellman-parameters-still-calculating-after-24-hours/95184#95184]。}} |
− | === |
+ | === 証明書情報を表示 === |
$ openssl x509 -text -in ''cert_filename'' |
$ openssl x509 -text -in ''cert_filename'' |
||
− | === |
+ | === 証明書の指紋を表示 === |
$ openssl x509 -noout -in ''cert_filename'' -fingerprint ''-digest'' |
$ openssl x509 -noout -in ''cert_filename'' -fingerprint ''-digest'' |
||
− | {{ic|''-digest''}} |
+ | {{ic|''-digest''}} はオプションで、{{ic|-md5}}、{{ic|-sha1}}、{{ic|-sha256}} または {{ic|-sha512}} のいずれか 1 つです。digest が指定されていない場合については、{{man|1ssl|x509|Input, Output, and General Purpose Options}} の「-digest」 を参照してください。 |
+ | |||
+ | === 証明書の形式を変換する === |
||
+ | |||
+ | {{ic|openssl x509}} を使用して、証明書をバイナリ (DER) 形式から PEM 形式 ({{ic|BEGIN CERTIFICATE}} ヘッダを含むテキスト形式) に変換します。 |
||
+ | |||
+ | $ openssl x509 -inform DER < ''myCA''.crt > ''myCA_pem''.crt |
||
+ | |||
+ | === サードパーティプロバイダーを使用する === |
||
+ | |||
+ | OpenSSL 3 では、OpenSSL プラグ可能性の新しい概念としてプロバイダーが導入されました。 OpenSSL に含まれていないアルゴリズムを再コンパイルすることなく使用できます。たとえば、[https://csrc.nist.gov/projects/post-quantum-cryptography NIST ポスト量子暗号] アルゴリズムをテストするには、[https://openquantumsafe.org/ Open Quantum Safe] プロバイダー {{AUR|oqsprovider}} をインストールできます。例として、[https://pq-crystals.org/dilithium/index.shtml Dilithium] 署名アルゴリズムのバリアントの 1 つを使用して、秘密キーを含む量子安全な自己署名証明書を生成できます。 |
||
+ | |||
+ | $ openssl req -provider oqsprovider -x509 -newkey dilithium3 -days ''days'' -keyout ''key'' -out ''cert'' |
||
== トラブルシューティング == |
== トラブルシューティング == |
||
111行目: | 129行目: | ||
$ openssl enc -d -md md5 -in encrypted -out decrypted |
$ openssl enc -d -md md5 -in encrypted -out decrypted |
||
− | === Python 3.10 |
+ | === Python 3.10 と "ca md too weak" エラー === |
+ | Python 3.10 のデフォルトでは、許可された OpenSSL 暗号のハードコードされたリストがあります。MD5 のような安全でないものは、OpenSSL のシステム全体の設定を無視して、 {{ic|ssl}} モジュールレベルで無効化されています。その結果、古い証明書や、時には {{ic|https}} 接続を確立するときでさえ、奇妙なエラーになることがあります、以下のような: |
||
− | In Python 3.10 by default there is a hardcoded list of allowed OpenSSL ciphers. Some of the less secure, like MD5, have been disabled at the {{ic|ssl}} module level, ignoring the system-wide configuration of OpenSSL. It results sometimes in strange errors on older certificates, sometimes even when establishing {{ic|https}} connections, like: |
||
requests.exceptions.SSLError: HTTPSConnectionPool(host='a.kind.of.example.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(398, '[SSL: CA_MD_TOO_WEAK] ca md too weak (_ssl.c:3862)'))) |
requests.exceptions.SSLError: HTTPSConnectionPool(host='a.kind.of.example.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(398, '[SSL: CA_MD_TOO_WEAK] ca md too weak (_ssl.c:3862)'))) |
||
− | + | Python をシステムの設定に従うようにするには、 {{ic|1=--with-ssl-default-suites=openssl}} パラメータを {{ic|./configure}} に追加して再構築する必要があるかもしれません。この問題は {{Bug|73549}} としても報告されています。 |
|
+ | |||
+ | === Error setting cipher XXX === |
||
+ | |||
+ | 「廃止された」暗号を使用しようとすると、次のようなエラーが発生します: |
||
+ | |||
+ | $ openssl bf -d -in cipher_file -K passphrase |
||
+ | Error setting cipher BF-CBC |
||
+ | 4087A97A8A7F0000:error:0308010C:digital envelope routines:inner_evp_generic_fetch:unsupported:crypto/evp/evp_fetch.c:341:Global default library context, Algorithm (BF-CBC : 12) |
||
+ | |||
+ | OpenSSL 3.0 以降、暗号化アルゴリズムは「プロバイダー」を通じて提供されます。最も古いまたはあまり使用されないアルゴリズムは、レガシープロバイダーに属します。[https://www.openssl.org/docs/man3.0/man7/OSSL_PROVIDER-legacy.html] |
||
+ | |||
+ | DES、RC4、Blowfish などの廃止されたアルゴリズムを使用する必要がある場合は、コマンドラインに {{ic|-provider legacy}} オプションを追加する必要があります。 |
||
+ | |||
+ | Blowfish 暗号をデコードするための完全な例を以下に示します。 |
||
+ | $ openssl bf -d -in cipher_file -provider legacy -provider default -K passphrase |
||
==参照== |
==参照== |
||
124行目: | 157行目: | ||
* [https://www.freebsd.org/doc/ja/books/handbook/openssl.html FreeBSD ハンドブック] |
* [https://www.freebsd.org/doc/ja/books/handbook/openssl.html FreeBSD ハンドブック] |
||
* [http://www.akadia.com/services/ssh_test_certificate.html 署名済みの SSL 証明書を作成するステップバイステップガイド] |
* [http://www.akadia.com/services/ssh_test_certificate.html 署名済みの SSL 証明書を作成するステップバイステップガイド] |
||
− | * [https://jamielinux.com/docs/openssl-certificate-authority/ OpenSSL Certificate Authority] |
+ | * [https://jamielinux.com/docs/openssl-certificate-authority/ OpenSSL Certificate Authority]: 独自の認証局として機能する方法を説明するガイド。 |
− | * [https://www.feistyduck.com/books/bulletproof-ssl-and-tls/bulletproof-ssl-and-tls-introduction.pdf Bulletproof SSL and TLS |
+ | * [https://www.feistyduck.com/books/bulletproof-ssl-and-tls/bulletproof-ssl-and-tls-introduction.pdf Bulletproof SSL and TLS by Ivan Ristić], SSL/TLS のより正式な入門書 |
+ | |||
+ | {{TranslationStatus|OpenSSL|2024-08-28|806140}} |
2024年8月28日 (水) 20:17時点における最新版
OpenSSL は SSL と TLS プロトコルのオープンソース実装で、可能な限り柔軟になるように設計されています。BSD, Linux, OpenVMS, Solaris, Windows などの様々なプラットフォームをサポートしています。
インストール
openssl は coreutils の依存関係として、デフォルトで Arch Linux にインストールされます。
開発者向けに様々な OpenSSL ライブラリのバインディングが用意されています。
- python-pyopenssl
- perl-net-ssleay
- lua-sec, lua52-sec, lua51-sec
- haskell-hsopenssl
- haskell-openssl-streams
設定
Arch Linux では OPENSSLDIR
は /etc/ssl
です。
OpenSSL 設定ファイルは、慣習的に /etc/ssl/openssl.cnf
に置かれ、最初は複雑に見えるかもしれません。シェルスクリプトの動作と同じように、変数が代入で展開されることがあることを覚えておいてください。設定ファイルの形式についての詳しい説明は、config(5ssl) を参照してください。
req セクション
キー、要求、および自己署名証明書の生成に関連する設定。
req セクションは DN プロンプトを担当する。一般的な誤解として、Common Name (CN) プロンプトがあり、これはユーザーの固有名詞を値として持つべきであると示唆するものです。エンドユーザー証明書は CN として マシンのホスト名 を持つ必要があり、一方 CA は有効な TLD を持つべきではありません。これは、認証されたエンドユーザーの CN と CA 証明書の組み合わせの中で、あるソフトウェアがエンドユーザー証明書は自己署名されていると誤認する可能性のある組み合わせが存在しないようにするためです。CA 証明書の中には、Equifax のように、CN を持たないものもあります。
$ openssl x509 -subject -noout < /etc/ssl/certs/Equifax_Secure_CA.pem
subject= /C=US/O=Equifax/OU=Equifax Secure Certificate Authority
使用方法
この章は、Transport Layer Security#証明書を取得を読んだ事を前提としています。
Curve25519 秘密鍵を生成
$ openssl genpkey -algorithm x25519 -out filename
ECDSA 秘密鍵を生成
$ openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out filename
RSA 秘密鍵を生成
genrsa に取って代わる(openssl(1ssl) によると)、genpkey(1ssl) を使用。
$ openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:keysize -out filename
暗号化された鍵が必要な場合は、-aes-256-cbc
オプションを使用します。
証明書署名要求を生成
req(1ssl) を使用。
$ openssl req -new -sha256 -key private_key -out filename
証明書署名リクエストを表示
証明書署名リクエストはエンコードされた形式で保存されます。リクエストを人間が読める形式で表示するには:
$ openssl req -noout -text -in filename
自己証明証明書を生成
$ openssl req -key private_key -x509 -new -days days -out filename
一つのコマンドで自己証明証明書と秘密鍵を生成
OpenSSL では、上記のコマンドを 1 つにまとめることができるので、場合によっては便利かもしれません。
$ openssl req -x509 -newkey rsa:4096 -days days -keyout key_filename -out cert_filename
CA 証明書による証明書署名要求への署名
$ openssl x509 -req -in cert_req_filename -days days -CA CA_cert -CAkey CA_cert_private_key -CAserial CA_cert_serial_file -out cert_out
ディフィー・ヘルマン パラメーターを生成
詳細については、ディフィー・ヘルマン鍵共有を参照してください。
現在のベストプラクティスは、RFC 7919の標準的なDHグループの1つ、例えば ffdhe2048 を使用することです。
あるいは、自分でランダムなグループを生成することもできます。
$ openssl dhparam -out filename 2048
証明書情報を表示
$ openssl x509 -text -in cert_filename
証明書の指紋を表示
$ openssl x509 -noout -in cert_filename -fingerprint -digest
-digest
はオプションで、-md5
、-sha1
、-sha256
または -sha512
のいずれか 1 つです。digest が指定されていない場合については、x509(1ssl) § Input, Output, and General Purpose Options の「-digest」 を参照してください。
証明書の形式を変換する
openssl x509
を使用して、証明書をバイナリ (DER) 形式から PEM 形式 (BEGIN CERTIFICATE
ヘッダを含むテキスト形式) に変換します。
$ openssl x509 -inform DER < myCA.crt > myCA_pem.crt
サードパーティプロバイダーを使用する
OpenSSL 3 では、OpenSSL プラグ可能性の新しい概念としてプロバイダーが導入されました。 OpenSSL に含まれていないアルゴリズムを再コンパイルすることなく使用できます。たとえば、NIST ポスト量子暗号 アルゴリズムをテストするには、Open Quantum Safe プロバイダー oqsproviderAUR をインストールできます。例として、Dilithium 署名アルゴリズムのバリアントの 1 つを使用して、秘密キーを含む量子安全な自己署名証明書を生成できます。
$ openssl req -provider oqsprovider -x509 -newkey dilithium3 -days days -keyout key -out cert
トラブルシューティング
復号時に "bad decrypt" と表示される
OpenSSL 1.1.0 から dgst と enc コマンドのデフォルトのダイジェストアルゴリズムが MD5 から SHA256 に変更されています [2]。
OpenSSL 1.0.2 以前を使ってファイルを暗号化した場合、復号化しようとすると新しいバージョンでは以下のようにエラーが発生します:
error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:crypto/evp/evp_enc.c:540
-md md5
オプションを指定することで問題は解決します:
$ openssl enc -d -md md5 -in encrypted -out decrypted
Python 3.10 と "ca md too weak" エラー
Python 3.10 のデフォルトでは、許可された OpenSSL 暗号のハードコードされたリストがあります。MD5 のような安全でないものは、OpenSSL のシステム全体の設定を無視して、 ssl
モジュールレベルで無効化されています。その結果、古い証明書や、時には https
接続を確立するときでさえ、奇妙なエラーになることがあります、以下のような:
requests.exceptions.SSLError: HTTPSConnectionPool(host='a.kind.of.example.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(398, '[SSL: CA_MD_TOO_WEAK] ca md too weak (_ssl.c:3862)')))
Python をシステムの設定に従うようにするには、 --with-ssl-default-suites=openssl
パラメータを ./configure
に追加して再構築する必要があるかもしれません。この問題は FS#73549 としても報告されています。
Error setting cipher XXX
「廃止された」暗号を使用しようとすると、次のようなエラーが発生します:
$ openssl bf -d -in cipher_file -K passphrase Error setting cipher BF-CBC 4087A97A8A7F0000:error:0308010C:digital envelope routines:inner_evp_generic_fetch:unsupported:crypto/evp/evp_fetch.c:341:Global default library context, Algorithm (BF-CBC : 12)
OpenSSL 3.0 以降、暗号化アルゴリズムは「プロバイダー」を通じて提供されます。最も古いまたはあまり使用されないアルゴリズムは、レガシープロバイダーに属します。[3]
DES、RC4、Blowfish などの廃止されたアルゴリズムを使用する必要がある場合は、コマンドラインに -provider legacy
オプションを追加する必要があります。
Blowfish 暗号をデコードするための完全な例を以下に示します。
$ openssl bf -d -in cipher_file -provider legacy -provider default -K passphrase
参照
- Wikipedia の OpenSSL のページ
- OpenSSL プロジェクトページ
- FreeBSD ハンドブック
- 署名済みの SSL 証明書を作成するステップバイステップガイド
- OpenSSL Certificate Authority: 独自の認証局として機能する方法を説明するガイド。
- Bulletproof SSL and TLS by Ivan Ristić, SSL/TLS のより正式な入門書