「OpenSSL」の版間の差分
細 (カテゴリ変更) |
Kusanaginoturugi (トーク | 投稿記録) (→一つのコマンドで自己証明証明書と秘密鍵を生成: 記事を追加) |
||
(2人の利用者による、間の27版が非表示) | |||
1行目: | 1行目: | ||
− | [[Category: |
+ | [[Category:トランスポート層セキュリティ]] |
[[en:OpenSSL]] |
[[en:OpenSSL]] |
||
+ | {{Related articles start}} |
||
− | {{Warning|2015年5月に公開された、OpenSSL のプロトコルの利用に関する共同研究によって、SSL 接続に "Logjam" 攻撃と呼ばれる、さらなる危険が存在することが判明しました。結果については https://weakdh.org/ を、推奨されるサーバー側の設定の変更については https://weakdh.org/sysadmin.html を見て下さい。}} |
||
+ | {{Related|Transport Layer Security}} |
||
+ | {{Related articles end}} |
||
− | [http://www.openssl.org OpenSSL] は SSL と TLS プロトコルのオープンソース実装で、 |
+ | [http://www.openssl.org OpenSSL] は SSL と TLS プロトコルのオープンソース実装で、可能な限り柔軟になるように設計されています。BSD, Linux, OpenVMS, Solaris, Windows などの様々なプラットフォームをサポートしています。 |
− | == |
+ | == インストール == |
− | <!-- Should be moved into [[SSL]] when someone covers other libraries, such as gnutls or the mozilla one. --> |
||
− | SSL に関する根本的な説明を飛ばして、SSL/TLS のセットアップだけを取り扱うために、この記事では基本的にファイルごとに SSL を説明します。 |
||
+ | {{Pkg|openssl}} は {{Pkg|coreutils}} の依存関係として、デフォルトで Arch Linux にインストールされます。 |
||
− | 詳しい情報は [[Wikipedia:ja:認証局]] や [[Wikipedia:ja:公開鍵基盤]] を参照してください。 |
||
+ | 開発者向けに様々な OpenSSL ライブラリのバインディングが用意されています。 |
||
− | ===認証局 (CA)=== |
||
− | 認証局はエンドユーザーからの要求に対して証明書を返します。そのために、返されるエンドユーザーの証明書は CA 秘密鍵と CA 証明書で署名されており、従って CA 公開鍵も含みます。CA は証明書失効リスト (CRL) も配布し、エンドユーザーにもはや有効ではない証明書を通知し、次の CRL の期限を伝えます。 |
||
+ | * {{Pkg|python-pyopenssl}} |
||
− | ====CA 秘密鍵==== |
||
+ | * {{Pkg|perl-net-ssleay}} |
||
− | CA 秘密鍵は3つの中で一番重要です。秘密鍵が漏洩してしまうと中央局が許諾を確認したり取り消すという目的が瓦解すると同時に、CA 証明書を証明するのに使われる CA 公開鍵に対する署名済みの鍵ともなります。CA 秘密鍵の署名は CA 証明書自体に埋め込まれているため、漏洩した CA 秘密鍵を使うことで攻撃者は CA 証明書を複製することができてしまいます。 |
||
+ | * {{Pkg|lua-sec}}, {{Pkg|lua52-sec}}, {{Pkg|lua51-sec}} |
||
+ | * {{Pkg|haskell-hsopenssl}} |
||
+ | * {{Pkg|haskell-openssl-streams}} |
||
+ | == 設定 == |
||
− | ====CA 証明書と公開鍵==== |
||
− | 単一のファイルとして全てのエンドユーザーに配布されます。CA 証明書と公開鍵を使うことで、メールサーバーやウェブサイトなど対応する CA によって署名されたとされる他のエンドユーザーの証明書を証明します。 |
||
+ | Arch Linux では {{ic|OPENSSLDIR}} は {{ic|/etc/ssl}} です。 |
||
− | ===エンドユーザー=== |
||
− | エンドユーザーは識別名 (DN) を含む証明書の要求をCA に送信します。通常、CA は同一の DN を持つ有効な証明書の発行を許可しません。前の証明書を無効化します。エンドユーザーの証明書は期限日に更新されなかったなどの理由で無効になることがあります。 |
||
+ | OpenSSL 設定ファイルは、慣習的に {{ic|/etc/ssl/openssl.cnf}} に置かれ、最初は複雑に見えるかもしれません。シェルスクリプトの動作と同じように、変数が代入で展開されることがあることを覚えておいてください。設定ファイルの形式についての詳しい説明は、{{man|5ssl|config}} を参照してください。 |
||
− | ====エンドユーザー生成鍵==== |
||
− | CA に送信する証明書の要求に署名するためにエンドユーザーは鍵を生成します。CA 秘密鍵と同じように、ユーザーの鍵が漏洩してしまうと攻撃者はユーザーに扮して、ユーザーの名前を使って要求を送信することが可能です。そうなると CA は前の正しいユーザー証明書を無効化してしまいます。 |
||
− | === |
+ | === req セクション === |
− | ユーザーの DN と公開鍵を含みます。その名のとおり、CA から証明書を取得する最初のプロセスを表します。 |
||
+ | キー、要求、および自己署名証明書の生成に関連する設定。 |
||
− | ====エンドユーザー証明書==== |
||
− | エンドユーザー証明書と CA 証明書の一番の違いはエンドユーザー証明書は証明書に署名することはできないということです。情報と引き換えに証明する方法を与えるだけです。 |
||
+ | req セクションは DN プロンプトを担当する。一般的な誤解として、''Common Name'' (CN) プロンプトがあり、これはユーザーの固有名詞を値として持つべきであると示唆するものです。エンドユーザー証明書は CN として '''マシンのホスト名''' を持つ必要があり、一方 CA は有効な TLD を持つべきではありません。これは、認証されたエンドユーザーの CN と CA 証明書の組み合わせの中で、あるソフトウェアがエンドユーザー証明書は自己署名されていると誤認する可能性のある組み合わせが存在しないようにするためです。CA 証明書の中には、[https://www.equifax.com Equifax] のように、CN を持たないものもあります。 |
||
− | ====証明書失効リスト (CRL)==== |
||
− | CRL も CA 鍵によって署名されていますが、エンドユーザー証明書に関する情報だけを規定します。通常、新しい CRL が下されるまで30日間のスパンがあります。 |
||
+ | {{hc|$ openssl x509 -subject -noout < /etc/ssl/certs/Equifax_Secure_CA.pem|2= |
||
− | ==設定== |
||
+ | subject= /C=US/O=Equifax/OU=Equifax Secure Certificate Authority |
||
− | OpenSSL の設定ファイルは {{ic|/etc/ssl/openssl.cnf}} に置かれることになっており、一見すると複雑なように見えます。設定を分割する ''include'' ディレクティブは存在しません。しかしながら、このセクションでは重要な設定をカバーしています。 |
||
+ | }} |
||
+ | == 使用方法 == |
||
− | シェルスクリプトと同じように、代入で変数を拡張することができます。設定ファイルの形式に関する詳しい説明は {{man|5ssl|config}} を見て下さい。オペレーティングシステムによっては、[[man ページ]]の名前が {{man|5|openssl-config|url=}} や {{man|5|config|url=}} になっていることがあります。場合によって、man では読むことができず次の場所にマニュアルが配置されることもあります: {{ic|/usr/share/openssl}}。 |
||
+ | この章は、[[Transport Layer Security#証明書を取得]]を読んだ事を前提としています。 |
||
− | ===グローバル変数=== |
||
− | 以下の設定は全てのセクションに適用されます。そのため、セクションヘッダの下に定義することはできません: |
||
+ | === Curve25519 秘密鍵を生成 === |
||
− | {{bc|<nowiki> |
||
− | DIR= . # Useful macro for populating real vars. |
||
− | RANDFILE= ${DIR}/private/.rnd # Entropy source. |
||
− | default_md= sha1 # Default message digest. |
||
− | </nowiki>}} |
||
+ | $ openssl genpkey -algorithm x25519 -out ''filename'' |
||
− | ===ca セクション=== |
||
− | 以下の設定は CRL に署名したり、証明書に署名、あるいは無効化するときに使われます。リクエストを生成したいだけのユーザーは [[#req セクション]]にスキップできます。 |
||
+ | === ECDSA 秘密鍵を生成 === |
||
− | {{bc|<nowiki> |
||
− | [ ca ] |
||
− | default_ca= dft_ca # Configuration files may have more than one CA |
||
− | # section for different scenarios. |
||
+ | $ openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out ''filename'' |
||
− | [ dft_ca ] |
||
− | certificate= ${DIR}/cacert.pem # The CA certificate. |
||
− | database= ${DIR}/index.txt # Keeps tracks of valid/revoked certs. |
||
− | new_certs_dir= ${DIR}/newcerts # Copies of signed certificates, for |
||
− | # administrative purposes. |
||
− | private_key= ${DIR}/private/cakey.pem # The CA key. |
||
− | serial= ${DIR}/serial # Should be populated with the next |
||
− | # cert hex serial. |
||
+ | === RSA 秘密鍵を生成 === |
||
− | # These govern the way certificates are displayed while confirming |
||
− | # the signing process. |
||
− | name_opt= ca_default |
||
− | cert_opt= ca_default |
||
+ | ''genrsa'' に取って代わる({{man|1ssl|openssl}} によると)、{{man|1ssl|genpkey}} を使用。 |
||
− | default_days= 365 # How long to sign certificates for. |
||
− | default_crl_days=30 # The same, but for CRL. |
||
+ | $ openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:''keysize'' -out ''filename'' |
||
− | policy= dft_policy # The default policy should be lenient. |
||
− | x509_extensions=cert_v3 # For v3 certificates. |
||
+ | 暗号化された鍵が必要な場合は、{{ic|-aes-256-cbc}} オプションを使用します。 |
||
− | [ dft_policy ] |
||
− | # A value of 'supplied' means the field must be present in the certificate, |
||
− | # whereas 'match' means the field must be populated with the same contents as |
||
− | # the CA certificate. 'optional' dictates that the field is entirely optional. |
||
+ | === 証明書署名要求を生成 === |
||
− | C= supplied # Country |
||
− | ST= supplied # State or province |
||
− | L= optional # Locality |
||
− | O= supplied # Organization |
||
− | OU= optional # Organizational unit |
||
− | CN= supplied # Common name |
||
+ | {{man|1ssl|req}} を使用。 |
||
− | [ cert_v3 ] |
||
− | # With the exception of 'CA:FALSE', there are PKIX recommendations for end-user |
||
− | # certificates that should not be able to sign other certificates. |
||
− | # 'CA:FALSE' is explicitely set because some software will malfunction without. |
||
+ | $ openssl req -new -sha256 -key ''private_key'' -out ''filename'' |
||
− | subjectKeyIdentifier= hash |
||
− | basicConstraints= CA:FALSE |
||
− | keyUsage= nonRepudiation, digitalSignature, keyEncipherment |
||
+ | === 証明書署名リクエストを表示 === |
||
− | nsCertType= client, email |
||
− | nsComment= "OpenSSL Generated Certificate" |
||
+ | 証明書署名リクエストはエンコードされた形式で保存されます。リクエストを人間が読める形式で表示するには: |
||
− | authorityKeyIdentifier=keyid:always,issuer:always |
||
− | </nowiki>}} |
||
+ | $ openssl req -noout -text -in ''filename'' |
||
− | ===req セクション=== |
||
− | 鍵やリクエスト、自己署名証明書の生成に関連する設定です。 |
||
+ | === 自己証明証明書を生成 === |
||
− | 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 [http://www.equifax.com Equifax]: |
||
− | {{hc|$ openssl x509 -subject -noout < /etc/ssl/certs/Equifax_Secure_CA.pem|2= |
||
− | subject= /C=US/O=Equifax/OU=Equifax Secure Certificate Authority}} |
||
+ | $ openssl req -key ''private_key'' -x509 -new -days ''days'' -out ''filename'' |
||
− | Even though splitting the files is not strictly necessary to normal functioning, it is very confusing to handle request generation and CA administration from the same configuration file, so it is advised to follow the convention of clearly separating the settings into two {{ic|cnf}} files and into two containing directories. |
||
+ | === 一つのコマンドで自己証明証明書と秘密鍵を生成 === |
||
− | Here are the settings that are common to both tasks: |
||
+ | OpenSSL では、上記のコマンドを 1 つにまとめることができるので、場合によっては便利かもしれません。 |
||
− | {{bc|<nowiki> |
||
− | [ req ] |
||
− | # Default bit encryption and out file for generated keys. |
||
− | default_bits= 2048 |
||
− | default_keyfile=private/cakey.pem |
||
+ | $ openssl req -x509 -newkey rsa:4096 -days ''days'' -keyout ''key_filename'' -out ''cert_filename'' |
||
− | string_mask= utf8only # Only allow utf8 strings in request/ca fields. |
||
− | prompt= no # Do not prompt for field value confirmation. |
||
− | </nowiki>}} |
||
+ | === CA 証明書による証明書署名要求への署名 === |
||
− | ====CA req 設定==== |
||
− | 以下の設定で、他の証明書を署名することができる標準的な 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'' |
||
− | {{bc|<nowiki> |
||
− | distinguished_name=ca_dn # Distinguished name contents. |
||
− | x509_extensions=ca_v3 # For generating ca certificates. |
||
+ | === ディフィー・ヘルマン パラメーターを生成 === |
||
− | [ ca_dn ] |
||
− | # CN isn't needed for CA certificates |
||
− | C= US |
||
− | ST= New Jersey |
||
− | O= localdomain |
||
+ | 詳細については、[[Wikipedia:ja:ディフィー・ヘルマン鍵共有|ディフィー・ヘルマン鍵共有]]を参照してください。 |
||
− | [ ca_v3 ] |
||
− | subjectKeyIdentifier= hash |
||
+ | 現在の[[MozillaWiki:Security/Server Side TLS|ベストプラクティス]]は、RFC 7919の標準的なDHグループの1つ、例えば [https://ssl-config.mozilla.org/ffdhe2048.txt ffdhe2048] を使用することです。 |
||
− | # PKIX says this should also contain the 'crucial' value, yet some programs |
||
− | # have trouble handling it. |
||
− | basicConstraints= CA:TRUE |
||
+ | あるいは、自分でランダムなグループを生成することもできます。 |
||
− | keyUsage= cRLSign, keyCertSign |
||
+ | $ openssl dhparam -out ''filename'' ''2048'' |
||
− | nsCertType= sslCA |
||
− | nsComment= "OpenSSL Generated CA Certificate" |
||
+ | {{Tip|特にハイエンドのハードウェアでない場合、生成を高速化するには、{{ic|-dsaparam}} オプションを追加します[https://security.stackexchange.com/questions/95178/diffie-hellman-parameters-still-calculating-after-24-hours/95184#95184]。}} |
||
− | authorityKeyIdentifier=keyid:always,issuer:always |
||
− | </nowiki>}} |
||
+ | === 証明書情報を表示 === |
||
− | ====エンドユーザー req 設定==== |
||
− | ほとんどの状況で使える v3 リクエストの作成: |
||
+ | $ openssl x509 -text -in ''cert_filename'' |
||
− | {{bc|<nowiki> |
||
− | distinguished_name=ca_dn # Distinguished name contents. |
||
− | req_extensions=req_v3 # For generating ca certificates. |
||
+ | === 証明書の指紋を表示 === |
||
− | [ ca_dn ] |
||
− | C= US |
||
− | ST= New Jersey |
||
− | O= localdomain |
||
− | CN= localhost |
||
+ | $ openssl x509 -noout -in ''cert_filename'' -fingerprint ''-digest'' |
||
− | [ req_v3 ] |
||
− | basicConstraints= CA:FALSE |
||
− | keyUsage= nonRepudiation, digitalSignature, keyEncipherment |
||
− | </nowiki>}} |
||
+ | {{ic|''-digest''}} はオプションで、{{ic|-md5}}、{{ic|-sha1}}、{{ic|-sha256}} または {{ic|-sha512}} のいずれか 1 つです。digest が指定されていない場合については、{{man|1ssl|x509|Input, Output, and General Purpose Options}} の「-digest」 を参照してください。 |
||
− | ===GOST エンジンのサポート=== |
||
− | まず、システム上に {{ic|libgost.so}} が存在することを確かめます: |
||
− | $ pacman -Ql openssl | grep libgost |
||
+ | === 証明書の形式を変換する === |
||
− | 何も問題がなければ、以下の行を設定に追加: |
||
− | openssl_conf = openssl_def # this must be a top-level declaration |
||
+ | {{ic|openssl x509}} を使用して、証明書をバイナリ (DER) 形式から PEM 形式 ({{ic|BEGIN CERTIFICATE}} ヘッダを含むテキスト形式) に変換します。 |
||
− | ドキュメントの末尾に以下の行を記述: |
||
− | [ openssl_def ] |
||
− | engines = engine_section |
||
− | |||
− | [ engine_section ] |
||
− | gost = gost_section |
||
− | |||
− | [ gost_section ] |
||
− | engine_id = gost |
||
− | soft_load = 1 |
||
− | dynamic_path = /usr/lib/engines/libgost.so |
||
− | default_algorithms = ALL |
||
− | CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet |
||
− | 公式の [http://ftp.netbsd.org/pub/NetBSD/NetBSD-current/src/crypto/external/bsd/openssl/dist/engines/ccgost/README.gost README.gost] にいくつか例が記載されています。 |
||
+ | $ openssl x509 -inform DER < ''myCA''.crt > ''myCA_pem''.crt |
||
− | ==鍵の生成== |
||
− | 鍵を生成する前に、保存するディレクトリを作成してください: |
||
− | $ mkdir -m0700 private |
||
− | 次に、あらかじめ鍵のパーミッションを設定しておきます: |
||
− | $ touch private/key.pem |
||
− | $ chmod 0600 private/key.pem |
||
− | もしくは [[umask]] を設定して新しく作成するファイルとディレクトリのパーティションを制限します: |
||
− | $ umask 077 |
||
+ | === サードパーティプロバイダーを使用する === |
||
− | {{ic|genpkey}} で鍵を生成する例: |
||
− | $ openssl genpkey -algorithm RSA -out private/key.pem -pkeyopt rsa_keygen_bits:4096 |
||
+ | 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 genpkey -aes-256-cbc -algorithm RSA -out private/key.pem -pkeyopt rsa_keygen_bits:4096 |
||
+ | $ openssl req -provider oqsprovider -x509 -newkey dilithium3 -days ''days'' -keyout ''key'' -out ''cert'' |
||
− | ==要求の作成== |
||
− | [http://www.cacert.org CAcert.org] などの公共の認証局や、ローカルで管理している認証局から証明書を取得するには、要求ファイルを CA に送信する必要があります。{{ic|csr}} ファイルと呼ばれます。 |
||
+ | == トラブルシューティング == |
||
− | 新しい要求を作成して先に[[#鍵の生成|生成した鍵]]を使って署名してください: |
||
− | $ openssl req -new -sha256 -key private/key.pem -out req.csr |
||
+ | === 復号時に "bad decrypt" と表示される === |
||
− | ==証明書の署名== |
||
− | ローカルで CA の署名を行う方法を説明します: 直接、自己署名証明書を作成するか、ローカルの CA を利用します。 |
||
+ | OpenSSL 1.1.0 から dgst と enc コマンドのデフォルトのダイジェストアルゴリズムが MD5 から SHA256 に変更されています [https://www.openssl.org/news/changelog.html#x6]。 |
||
− | ===自己署名証明書=== |
||
− | 自己署名証明書では動作しないプログラムは多数存在し、複数のシステムを自己署名証明書で管理する場合、[[#認証局|認証局]]をセットアップする方がずっとトラブルが少なくなります。 |
||
+ | OpenSSL 1.0.2 以前を使ってファイルを暗号化した場合、復号化しようとすると新しいバージョンでは以下のようにエラーが発生します: |
||
− | [[#鍵の生成|先に説明]]したとおりに鍵を生成した場合、次のコマンドを使って新しい証明書に署名します: |
||
− | $ openssl req -key private/key.pem -x509 -new -days 3650 -out cacert.pem |
||
+ | error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:crypto/evp/evp_enc.c:540 |
||
− | ===認証局=== |
||
− | [https://jamielinux.com/docs/openssl-certificate-authority/ OpenSSL Certificate Authority] には OpenSSL を CA として使用する詳しいガイドが載っています。 |
||
+ | {{ic|-md md5}} オプションを指定することで問題は解決します: |
||
− | The method shown in this section is mostly meant to show how signing works; it is not suited for large deployments that need to automate signing a large number of certificates. Consider installing an SSL server for that purpose. |
||
+ | $ openssl enc -d -md md5 -in encrypted -out decrypted |
||
− | Makefile を作成するまえに、[[#設定]] に従って設定ファイルを作成してください。要求の作成ではなく CA の管理に関する指示に従って下さい。 |
||
+ | === Python 3.10 と "ca md too weak" エラー === |
||
− | ====Makefile==== |
||
− | {{ic|Makefile}} としてファイルに保存して、ファイルが存在するディレクトリで {{Ic|make}} を実行することで最初の CRL が生成されます: |
||
+ | Python 3.10 のデフォルトでは、許可された OpenSSL 暗号のハードコードされたリストがあります。MD5 のような安全でないものは、OpenSSL のシステム全体の設定を無視して、 {{ic|ssl}} モジュールレベルで無効化されています。その結果、古い証明書や、時には {{ic|https}} 接続を確立するときでさえ、奇妙なエラーになることがあります、以下のような: |
||
− | {{bc|<nowiki> |
||
− | OPENSSL= openssl |
||
− | CNF= openssl.cnf |
||
− | CA= ${OPENSSL} ca -config ${CNF} |
||
− | REQ= ${OPENSSL} req -config ${CNF} |
||
+ | 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)'))) |
||
− | KEY= private/cakey.pem |
||
− | KEYMODE= RSA |
||
+ | Python をシステムの設定に従うようにするには、 {{ic|1=--with-ssl-default-suites=openssl}} パラメータを {{ic|./configure}} に追加して再構築する必要があるかもしれません。この問題は {{Bug|73549}} としても報告されています。 |
||
− | CACERT= cacert.pem |
||
− | CADAYS= 3650 |
||
+ | === Error setting cipher XXX === |
||
− | CRL= crl.pem |
||
− | INDEX= index.txt |
||
− | SERIAL= serial |
||
+ | 「廃止された」暗号を使用しようとすると、次のようなエラーが発生します: |
||
+ | $ openssl bf -d -in cipher_file -K passphrase |
||
− | CADEPS= ${CNF} ${KEY} ${CACERT} |
||
+ | 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] |
||
− | all: ${CRL} |
||
+ | DES、RC4、Blowfish などの廃止されたアルゴリズムを使用する必要がある場合は、コマンドラインに {{ic|-provider legacy}} オプションを追加する必要があります。 |
||
− | ${CRL}: ${CADEPS} |
||
− | ${CA} -gencrl -out ${CRL} |
||
+ | Blowfish 暗号をデコードするための完全な例を以下に示します。 |
||
− | ${CACERT}: ${CNF} ${KEY} |
||
+ | $ openssl bf -d -in cipher_file -provider legacy -provider default -K passphrase |
||
− | ${REQ} -key ${KEY} -x509 -new -days ${CADAYS} -out ${CACERT} |
||
− | rm -f ${INDEX} |
||
− | touch ${INDEX} |
||
− | echo 100001 > ${SERIAL} |
||
− | |||
− | ${KEY}: ${CNF} |
||
− | mkdir -m0700 -p $(dir ${KEY}) |
||
− | touch ${KEY} |
||
− | chmod 0600 ${KEY} |
||
− | ${OPENSSL} genpkey -algorithm ${KEYMODE} -out ${KEY} |
||
− | |||
− | |||
− | revoke: ${CADEPS} ${item} |
||
− | @test -n $${item:?'usage: ${MAKE} revoke item=cert.pem'} |
||
− | ${CA} -revoke ${item} |
||
− | ${MAKE} ${CRL} |
||
− | |||
− | sign: ${CADEPS} ${item} |
||
− | @test -n $${item:?'usage: ${MAKE} sign item=request.csr'} |
||
− | mkdir -p newcerts |
||
− | ${CA} -in ${item} -out ${item:.csr=.crt} |
||
− | </nowiki>}} |
||
− | |||
− | 証明書に署名するには: |
||
− | $ make sign item='''req.csr''' |
||
− | |||
− | 証明書を無効化するには: |
||
− | $ make revoke item='''cert.pem''' |
||
− | |||
− | == トラブルシューティング == |
||
− | |||
− | === 復号時に "bad decrypt" と表示される === |
||
− | |||
− | OpenSSL 1.1.0 から dgst と enc コマンドのデフォルトのダイジェストアルゴリズムが MD5 から SHA256 に変更されています [https://www.openssl.org/news/changelog.html#x6]。 |
||
− | |||
− | OpenSSL 1.0.2 以前を使ってファイルを暗号化した場合、復号化しようとすると新しいバージョンでは以下のようにエラーが発生します: |
||
− | |||
− | error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:crypto/evp/evp_enc.c:540 |
||
− | |||
− | {{ic|-md md5}} オプションを指定することで問題は解決します: |
||
− | |||
− | $ openssl enc -d -md md5 -in encrypted -out decrypted |
||
==参照== |
==参照== |
||
306行目: | 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 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 のより正式な入門書