「OpenSSL」の版間の差分
(→req セクション: 翻訳) |
Kusanaginoturugi (トーク | 投稿記録) (→参照: 飜訳) |
||
(2人の利用者による、間の19版が非表示) | |||
1行目: | 1行目: | ||
[[Category:Transport Layer Security]] |
[[Category:Transport Layer Security]] |
||
[[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 などの様々なプラットフォームをサポートしています。 |
+ | {{Warning|2015年5月に公開された、OpenSSL のプロトコルの利用に関する共同研究によって、SSL 接続に "Logjam" 攻撃と呼ばれる、さらなる危険が存在することが判明しました。結果については https://weakdh.org/ を、推奨されるサーバー側の設定の変更については https://weakdh.org/sysadmin.html を見て下さい。}} |
||
− | ==SSL のイントロダクション== |
||
− | <!-- Should be moved into [[SSL]] when someone covers other libraries, such as gnutls or the mozilla one. --> |
||
− | SSL に関する根本的な説明を飛ばして、SSL/TLS のセットアップだけを取り扱うために、この記事では基本的にファイルごとに SSL を説明します。 |
||
+ | == インストール == |
||
− | 詳しい情報は [[Wikipedia:ja:認証局]] や [[Wikipedia:ja:公開鍵基盤]] を参照してください。 |
||
+ | {{Pkg|openssl}} は {{Pkg|coreutils}} の依存関係として、デフォルトで Arch Linux にインストールされます。 |
||
− | ===認証局 (CA)=== |
||
− | 認証局はエンドユーザーからの要求に対して証明書を返します。そのために、返されるエンドユーザーの証明書は CA 秘密鍵と CA 証明書で署名されており、従って CA 公開鍵も含みます。CA は証明書失効リスト (CRL) も配布し、エンドユーザーにもはや有効ではない証明書を通知し、次の CRL の期限を伝えます。 |
||
+ | 開発者向けに様々な OpenSSL ライブラリのバインディングが用意されています。 |
||
− | ====CA 秘密鍵==== |
||
− | CA 秘密鍵は3つの中で一番重要です。秘密鍵が漏洩してしまうと中央局が許諾を確認したり取り消すという目的が瓦解すると同時に、CA 証明書を証明するのに使われる CA 公開鍵に対する署名済みの鍵ともなります。CA 秘密鍵の署名は CA 証明書自体に埋め込まれているため、漏洩した CA 秘密鍵を使うことで攻撃者は CA 証明書を複製することができてしまいます。 |
||
+ | * {{Pkg|python-pyopenssl}} |
||
− | ====CA 証明書と公開鍵==== |
||
+ | * {{Pkg|perl-net-ssleay}} |
||
− | 単一のファイルとして全てのエンドユーザーに配布されます。CA 証明書と公開鍵を使うことで、メールサーバーやウェブサイトなど対応する CA によって署名されたとされる他のエンドユーザーの証明書を証明します。 |
||
+ | * {{Pkg|lua-sec}}, {{Pkg|lua52-sec}}, {{Pkg|lua51-sec}} |
||
+ | * {{Pkg|haskell-hsopenssl}} |
||
+ | * {{Pkg|haskell-openssl-streams}} |
||
+ | == 設定 == |
||
− | ===エンドユーザー=== |
||
− | エンドユーザーは識別名 (DN) を含む証明書の要求をCA に送信します。通常、CA は同一の DN を持つ有効な証明書の発行を許可しません。前の証明書を無効化します。エンドユーザーの証明書は期限日に更新されなかったなどの理由で無効になることがあります。 |
||
+ | Arch Linux では {{ic|OPENSSLDIR}} は {{ic|/etc/ssl}} です。 |
||
− | ====エンドユーザー生成鍵==== |
||
− | CA に送信する証明書の要求に署名するためにエンドユーザーは鍵を生成します。CA 秘密鍵と同じように、ユーザーの鍵が漏洩してしまうと攻撃者はユーザーに扮して、ユーザーの名前を使って要求を送信することが可能です。そうなると CA は前の正しいユーザー証明書を無効化してしまいます。 |
||
+ | OpenSSL 設定ファイルは、慣習的に {{ic|/etc/ssl/openssl.cnf}} に置かれ、最初は複雑に見えるかもしれません。シェルスクリプトの動作と同じように、変数が代入で展開されることがあることを覚えておいてください。設定ファイルの形式についての詳しい説明は、{{man|5ssl|config}} を参照してください。 |
||
− | ====証明書の要求==== |
||
− | ユーザーの DN と公開鍵を含みます。その名のとおり、CA から証明書を取得する最初のプロセスを表します。 |
||
+ | === req セクション === |
||
− | ====エンドユーザー証明書==== |
||
− | エンドユーザー証明書と CA 証明書の一番の違いはエンドユーザー証明書は証明書に署名することはできないということです。情報と引き換えに証明する方法を与えるだけです。 |
||
+ | キー、要求、および自己署名証明書の生成に関連する設定。 |
||
− | ====証明書失効リスト (CRL)==== |
||
− | CRL も CA 鍵によって署名されていますが、エンドユーザー証明書に関する情報だけを規定します。通常、新しい CRL が下されるまで30日間のスパンがあります。 |
||
+ | req セクションは DN プロンプトを担当する。一般的な誤解として、''Common Name'' (CN) プロンプトがあり、これはユーザーの固有名詞を値として持つべきであると示唆するものです。エンドユーザー証明書は CN として '''マシンのホスト名''' を持つ必要があり、一方 CA は有効な TLD を持つべきではありません。これは、認証されたエンドユーザーの CN と CA 証明書の組み合わせの中で、あるソフトウェアがエンドユーザー証明書は自己署名されていると誤認する可能性のある組み合わせが存在しないようにするためです。CA 証明書の中には、[https://www.equifax.com Equifax] のように、CN を持たないものもあります。 |
||
− | ==設定== |
||
− | 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}}。 |
||
− | |||
− | ===グローバル変数=== |
||
− | 以下の設定は全てのセクションに適用されます。そのため、セクションヘッダの下に定義することはできません: |
||
− | |||
− | {{bc|<nowiki> |
||
− | DIR= . # Useful macro for populating real vars. |
||
− | RANDFILE= ${DIR}/private/.rnd # Entropy source. |
||
− | default_md= sha1 # Default message digest. |
||
− | </nowiki>}} |
||
− | |||
− | ===ca セクション=== |
||
− | 以下の設定は CRL に署名したり、証明書に署名、あるいは無効化するときに使われます。リクエストを生成したいだけのユーザーは [[#req セクション]]にスキップできます。 |
||
− | |||
− | {{bc|<nowiki> |
||
− | [ ca ] |
||
− | default_ca= dft_ca # Configuration files may have more than one CA |
||
− | # section for different scenarios. |
||
− | |||
− | [ 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. |
||
− | |||
− | # These govern the way certificates are displayed while confirming |
||
− | # the signing process. |
||
− | name_opt= ca_default |
||
− | cert_opt= ca_default |
||
− | |||
− | default_days= 365 # How long to sign certificates for. |
||
− | default_crl_days=30 # The same, but for CRL. |
||
− | |||
− | policy= dft_policy # The default policy should be lenient. |
||
− | x509_extensions=cert_v3 # For v3 certificates. |
||
− | |||
− | [ 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 |
||
− | |||
− | [ 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. |
||
− | |||
− | subjectKeyIdentifier= hash |
||
− | basicConstraints= CA:FALSE |
||
− | keyUsage= nonRepudiation, digitalSignature, keyEncipherment |
||
− | |||
− | nsCertType= client, email |
||
− | nsComment= "OpenSSL Generated Certificate" |
||
− | |||
− | authorityKeyIdentifier=keyid:always,issuer:always |
||
− | </nowiki>}} |
||
− | |||
− | ===req セクション=== |
||
− | 鍵やリクエスト、自己署名証明書の生成に関連する設定です。 |
||
− | |||
− | req セクションは DN プロンプトを担当します。一般的な誤解は ''Common Name'' (CN) プロンプトです。これは、値としてユーザーの適切な名前を使用する必要があることを示唆しています。エンドユーザー証明書にはCNとして '''マシンのホスト名''' が必要ですが、 CA には有効な TLD が ''ない'' 必要があるため、認定されたエンドユーザーの可能な組み合わせの間で CN と CA 証明書には、エンドユーザー証明書が自己署名されていることを意味するものとして一部のソフトウェアによって誤解される可能性があります。 [http://www.equifax.com Equifax] のように、一部の CA 証明書には CN はありません。 |
||
{{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= |
||
− | subject= /C=US/O=Equifax/OU=Equifax Secure Certificate Authority |
+ | subject= /C=US/O=Equifax/OU=Equifax Secure Certificate Authority |
+ | }} |
||
+ | == 使用方法 == |
||
− | ファイルを分割することは通常の機能に厳密に必要ではありませんが、同じ構成ファイルからの要求生成とCA管理を処理することは非常に混乱するため、設定を2つに明確に分離する規則に従うことをお勧めします {{ic|cnf}} ファイルと2つの含まれるディレクトリに。 |
||
+ | この章は、[[Transport Layer Security#証明書を取得]]を読んだ事を前提としています。 |
||
− | 両方のタスクに共通の設定は次のとおりです。 |
||
+ | === Curve25519 秘密鍵を生成 === |
||
− | {{bc|<nowiki> |
||
− | [ req ] |
||
− | # Default bit encryption and out file for generated keys. |
||
− | default_bits= 2048 |
||
− | default_keyfile=private/cakey.pem |
||
+ | $ openssl genpkey -algorithm x25519 -out ''file'' |
||
− | string_mask= utf8only # Only allow utf8 strings in request/ca fields. |
||
− | prompt= no # Do not prompt for field value confirmation. |
||
− | </nowiki>}} |
||
+ | === ECDSA 秘密鍵を生成 === |
||
− | ====CA req 設定==== |
||
− | 以下の設定で、他の証明書を署名することができる標準的な CA が作成されます: |
||
+ | $ openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out ''file'' |
||
− | {{bc|<nowiki> |
||
− | distinguished_name=ca_dn # Distinguished name contents. |
||
− | x509_extensions=ca_v3 # For generating ca certificates. |
||
+ | === RSA 秘密鍵を生成 === |
||
− | [ ca_dn ] |
||
− | # CN isn't needed for CA certificates |
||
− | C= US |
||
− | ST= New Jersey |
||
− | O= localdomain |
||
+ | ''genrsa'' に取って代わる({{man|1ssl|openssl}} によると)、{{man|1ssl|genpkey}} を使用。 |
||
− | [ ca_v3 ] |
||
− | subjectKeyIdentifier= hash |
||
+ | $ openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:''keysize'' -out ''file'' |
||
− | # PKIX says this should also contain the 'crucial' value, yet some programs |
||
− | # have trouble handling it. |
||
− | basicConstraints= CA:TRUE |
||
+ | 暗号化された鍵が必要な場合は、{{ic|-aes-256-cbc}} オプションを使用します。 |
||
− | keyUsage= cRLSign, keyCertSign |
||
+ | === 証明書署名要求を生成 === |
||
− | nsCertType= sslCA |
||
− | nsComment= "OpenSSL Generated CA Certificate" |
||
+ | {{man|1ssl|req}} を使用。 |
||
− | authorityKeyIdentifier=keyid:always,issuer:always |
||
− | </nowiki>}} |
||
+ | $ openssl req -new -sha256 -key ''private_key'' -out ''filename'' |
||
− | ====エンドユーザー req 設定==== |
||
− | ほとんどの状況で使える v3 リクエストの作成: |
||
+ | === 証明書署名リクエストを表示 === |
||
− | {{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 req -noout -text -in ''filename'' |
||
− | [ req_v3 ] |
||
− | basicConstraints= CA:FALSE |
||
− | keyUsage= nonRepudiation, digitalSignature, keyEncipherment |
||
− | </nowiki>}} |
||
+ | === 自己証明証明書を生成 === |
||
− | ===GOST エンジンのサポート=== |
||
− | まず、システム上に {{ic|libgost.so}} が存在することを確かめます: |
||
− | $ pacman -Ql openssl | grep libgost |
||
+ | $ openssl req -key ''private_key'' -x509 -new -days ''days'' -out ''filename'' |
||
− | 何も問題がなければ、以下の行を設定に追加: |
||
− | openssl_conf = openssl_def # this must be a top-level declaration |
||
+ | === 一つのコマンドで自己証明証明書と秘密鍵を生成 === |
||
− | ドキュメントの末尾に以下の行を記述: |
||
− | [ 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 では、上記のコマンドを 1 つにまとめることができるので、場合によっては便利かもしれません。 |
||
− | ==鍵の生成== |
||
− | 鍵を生成する前に、保存するディレクトリを作成してください: |
||
− | $ mkdir -m0700 private |
||
− | 次に、あらかじめ鍵のパーミッションを設定しておきます: |
||
− | $ touch private/key.pem |
||
− | $ chmod 0600 private/key.pem |
||
− | もしくは [[umask]] を設定して新しく作成するファイルとディレクトリのパーティションを制限します: |
||
− | $ umask 077 |
||
+ | $ openssl req -x509 -newkey rsa:4096 -days ''days'' -keyout ''key_filename'' -out ''cert_filename'' |
||
− | {{ic|genpkey}} で鍵を生成する例: |
||
− | $ openssl genpkey -algorithm RSA -out private/key.pem -pkeyopt rsa_keygen_bits:4096 |
||
+ | === Diffie–Hellman パラメーターを生成 === |
||
− | 鍵を暗号化したい場合、以下のコマンドを使って下さい。パスワードが要求されます: |
||
− | $ openssl genpkey -aes-256-cbc -algorithm RSA -out private/key.pem -pkeyopt rsa_keygen_bits:4096 |
||
+ | 詳細については、[[Wikipedia:Diffie–Hellman key exchange|Diffie–Hellman key exchange]] を参照してください。 |
||
− | ==要求の作成== |
||
− | [http://www.cacert.org CAcert.org] などの公共の認証局や、ローカルで管理している認証局から証明書を取得するには、要求ファイルを CA に送信する必要があります。{{ic|csr}} ファイルと呼ばれます。 |
||
+ | 現在の[[MozillaWiki:Security/Server Side TLS|ベストプラクティス]]は、RFC 7919の標準的なDHグループの1つ、例えば [https://ssl-config.mozilla.org/ffdhe2048.txt ffdhe2048] を使用することです。 |
||
− | 新しい要求を作成して先に[[#鍵の生成|生成した鍵]]を使って署名してください: |
||
− | $ openssl req -new -sha256 -key private/key.pem -out req.csr |
||
+ | あるいは、自分でランダムなグループを生成することもできます。 |
||
− | ==証明書の署名== |
||
− | ローカルで CA の署名を行う方法を説明します: 直接、自己署名証明書を作成するか、ローカルの CA を利用します。 |
||
+ | $ openssl dhparam -out ''filename'' ''2048'' |
||
− | ===自己署名証明書=== |
||
− | 自己署名証明書では動作しないプログラムは多数存在し、複数のシステムを自己署名証明書で管理する場合、[[#認証局|認証局]]をセットアップする方がずっとトラブルが少なくなります。 |
||
+ | {{Tip|特にハイエンドのハードウェアでない場合、生成を高速化するには、{{ic|-dsaparam}} オプションを追加します[https://security.stackexchange.com/questions/95178/diffie-hellman-parameters-still-calculating-after-24-hours/95184#95184]。}} |
||
− | [[#鍵の生成|先に説明]]したとおりに鍵を生成した場合、次のコマンドを使って新しい証明書に署名します: |
||
+ | === 証明書情報を表示 === |
||
− | $ openssl req -key private/key.pem -x509 -new -days 3650 -out cacert.pem |
||
+ | $ openssl x509 -text -in ''cert_filename'' |
||
− | ===認証局=== |
||
− | [https://jamielinux.com/docs/openssl-certificate-authority/ OpenSSL Certificate Authority] には OpenSSL を CA として使用する詳しいガイドが載っています。 |
||
+ | === 証明書の指紋を表示 === |
||
− | 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 x509 -noout -in ''cert_filename'' -fingerprint ''-digest'' |
||
− | Makefile を作成するまえに、[[#設定]] に従って設定ファイルを作成してください。要求の作成ではなく CA の管理に関する指示に従って下さい。 |
||
+ | {{ic|''-digest''}} はオプションで、{{ic|-md5}}、{{ic|-sha1}}、{{ic|-sha256}} または {{ic|-sha512}} のいずれか 1 つです。digest が指定されていない場合については、{{man|1ssl|x509|Input, Output, and General Purpose Options}} の「-digest」 を参照してください。 |
||
− | ====Makefile==== |
||
− | {{ic|Makefile}} としてファイルに保存して、ファイルが存在するディレクトリで {{Ic|make}} を実行することで最初の CRL が生成されます: |
||
+ | === 証明書の形式を変換する === |
||
− | {{bc|<nowiki> |
||
− | OPENSSL= openssl |
||
− | CNF= openssl.cnf |
||
− | CA= ${OPENSSL} ca -config ${CNF} |
||
− | REQ= ${OPENSSL} req -config ${CNF} |
||
+ | {{ic|openssl x509}} を使用して、証明書をバイナリ (DER) 形式から PEM 形式 ({{ic|BEGIN CERTIFICATE}} ヘッダを含むテキスト形式) に変換します。 |
||
− | KEY= private/cakey.pem |
||
− | KEYMODE= RSA |
||
+ | $ openssl x509 -inform DER < ''myCA''.crt > ''myCA_pem''.crt |
||
− | CACERT= cacert.pem |
||
− | CADAYS= 3650 |
||
+ | === サードパーティプロバイダーを使用する === |
||
− | CRL= crl.pem |
||
− | INDEX= index.txt |
||
− | SERIAL= serial |
||
+ | 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'' |
||
− | CADEPS= ${CNF} ${KEY} ${CACERT} |
||
− | |||
− | all: ${CRL} |
||
− | |||
− | ${CRL}: ${CADEPS} |
||
− | ${CA} -gencrl -out ${CRL} |
||
− | |||
− | ${CACERT}: ${CNF} ${KEY} |
||
− | ${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''' |
||
== トラブルシューティング == |
== トラブルシューティング == |
||
300行目: | 125行目: | ||
$ openssl enc -d -md md5 -in encrypted -out decrypted |
$ openssl enc -d -md md5 -in encrypted -out decrypted |
||
+ | |||
+ | === Python 3.10 と "ca md too weak" エラー === |
||
+ | |||
+ | Python 3.10 のデフォルトでは、許可された OpenSSL 暗号のハードコードされたリストがあります。MD5 のような安全でないものは、OpenSSL のシステム全体の設定を無視して、 {{ic|ssl}} モジュールレベルで無効化されています。その結果、古い証明書や、時には {{ic|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 をシステムの設定に従うようにするには、 {{ic|1=--with-ssl-default-suites=openssl}} パラメータを {{ic|./configure}} に追加して再構築する必要があるかもしれません。この問題は {{Bug|73549}} としても報告されています。 |
||
==参照== |
==参照== |
||
306行目: | 139行目: | ||
* [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 のより正式な入門書 |
2023年6月7日 (水) 21:54時点における版
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 file
ECDSA 秘密鍵を生成
$ openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out file
RSA 秘密鍵を生成
genrsa に取って代わる(openssl(1ssl) によると)、genpkey(1ssl) を使用。
$ openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:keysize -out file
暗号化された鍵が必要な場合は、-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
Diffie–Hellman パラメーターを生成
詳細については、Diffie–Hellman key exchange を参照してください。
現在のベストプラクティスは、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 としても報告されています。
参照
- Wikipedia の OpenSSL のページ
- OpenSSL プロジェクトページ
- FreeBSD ハンドブック
- 署名済みの SSL 証明書を作成するステップバイステップガイド
- OpenSSL Certificate Authority: 独自の認証局として機能する方法を説明するガイド。
- Bulletproof SSL and TLS by Ivan Ristić, SSL/TLS のより正式な入門書