「OpenSSL」の版間の差分
Kusanaginoturugi (トーク | 投稿記録) (→参照: add link.) |
Kusanaginoturugi (トーク | 投稿記録) (英語版に記事を差し替え) |
||
9行目: | 9行目: | ||
{{Warning|2015年5月に公開された、OpenSSL のプロトコルの利用に関する共同研究によって、SSL 接続に "Logjam" 攻撃と呼ばれる、さらなる危険が存在することが判明しました。結果については https://weakdh.org/ を、推奨されるサーバー側の設定の変更については https://weakdh.org/sysadmin.html を見て下さい。}} |
{{Warning|2015年5月に公開された、OpenSSL のプロトコルの利用に関する共同研究によって、SSL 接続に "Logjam" 攻撃と呼ばれる、さらなる危険が存在することが判明しました。結果については https://weakdh.org/ を、推奨されるサーバー側の設定の変更については https://weakdh.org/sysadmin.html を見て下さい。}} |
||
+ | == Installation == |
||
− | ==SSL のイントロダクション== |
||
− | <!-- Should be moved into [[SSL]] when someone covers other libraries, such as gnutls or the mozilla one. --> |
||
− | SSL に関する根本的な説明を飛ばして、SSL/TLS のセットアップだけを取り扱うために、この記事では基本的にファイルごとに SSL を説明します。 |
||
+ | {{Pkg|openssl}} is installed by default on Arch Linux (as a dependency of {{Pkg|coreutils}}). |
||
− | 詳しい情報は [[Wikipedia:ja:認証局]] や [[Wikipedia:ja:公開鍵基盤]] を参照してください。 |
||
+ | There are various OpenSSL library bindings available for developers: |
||
− | ===認証局 (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}} |
||
+ | == Configuration == |
||
− | ====CA 証明書と公開鍵==== |
||
− | 単一のファイルとして全てのエンドユーザーに配布されます。CA 証明書と公開鍵を使うことで、メールサーバーやウェブサイトなど対応する CA によって署名されたとされる他のエンドユーザーの証明書を証明します。 |
||
+ | On Arch Linux the {{ic|OPENSSLDIR}} is {{ic|/etc/ssl}}. |
||
− | ===エンドユーザー=== |
||
− | エンドユーザーは識別名 (DN) を含む証明書の要求をCA に送信します。通常、CA は同一の DN を持つ有効な証明書の発行を許可しません。前の証明書を無効化します。エンドユーザーの証明書は期限日に更新されなかったなどの理由で無効になることがあります。 |
||
+ | 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}}. |
||
− | ====エンドユーザー生成鍵==== |
||
− | CA に送信する証明書の要求に署名するためにエンドユーザーは鍵を生成します。CA 秘密鍵と同じように、ユーザーの鍵が漏洩してしまうと攻撃者はユーザーに扮して、ユーザーの名前を使って要求を送信することが可能です。そうなると CA は前の正しいユーザー証明書を無効化してしまいます。 |
||
− | === |
+ | === req section === |
− | ユーザーの DN と公開鍵を含みます。その名のとおり、CA から証明書を取得する最初のプロセスを表します。 |
||
+ | {{Merge|#Generate a certificate signing request|Same topic.|section=Plan}} |
||
− | ====エンドユーザー証明書==== |
||
− | エンドユーザー証明書と CA 証明書の一番の違いはエンドユーザー証明書は証明書に署名することはできないということです。情報と引き換えに証明する方法を与えるだけです。 |
||
+ | Settings related to generating keys, requests and self-signed certificates. |
||
− | ====証明書失効リスト (CRL)==== |
||
− | CRL も CA 鍵によって署名されていますが、エンドユーザー証明書に関する情報だけを規定します。通常、新しい CRL が下されるまで30日間のスパンがあります。 |
||
+ | 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]: |
||
− | ==設定== |
||
− | 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つの含まれるディレクトリに。 |
||
− | |||
− | 両方のタスクに共通の設定は次のとおりです。 |
||
− | |||
− | {{bc|<nowiki> |
||
− | [ req ] |
||
− | # Default bit encryption and out file for generated keys. |
||
− | default_bits= 2048 |
||
− | default_keyfile=private/cakey.pem |
||
− | |||
− | string_mask= utf8only # Only allow utf8 strings in request/ca fields. |
||
− | prompt= no # Do not prompt for field value confirmation. |
||
− | </nowiki>}} |
||
− | |||
− | ====CA req 設定==== |
||
− | 以下の設定で、他の証明書を署名することができる標準的な CA が作成されます: |
||
− | |||
− | {{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 |
||
− | |||
− | [ ca_v3 ] |
||
− | subjectKeyIdentifier= hash |
||
− | |||
− | # PKIX says this should also contain the 'crucial' value, yet some programs |
||
− | # have trouble handling it. |
||
− | basicConstraints= CA:TRUE |
||
− | |||
− | keyUsage= cRLSign, keyCertSign |
||
− | |||
− | nsCertType= sslCA |
||
− | nsComment= "OpenSSL Generated CA Certificate" |
||
− | |||
− | authorityKeyIdentifier=keyid:always,issuer:always |
||
− | </nowiki>}} |
||
− | |||
− | ====エンドユーザー 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 |
||
− | |||
− | [ req_v3 ] |
||
− | basicConstraints= CA:FALSE |
||
− | keyUsage= nonRepudiation, digitalSignature, keyEncipherment |
||
− | </nowiki>}} |
||
− | |||
− | ===GOST エンジンのサポート=== |
||
− | まず、システム上に {{ic|libgost.so}} が存在することを確かめます: |
||
− | $ pacman -Ql openssl | grep libgost |
||
+ | == Usage == |
||
− | 何も問題がなければ、以下の行を設定に追加: |
||
− | openssl_conf = openssl_def # this must be a top-level declaration |
||
+ | This sections assumes you have read [[Transport Layer Security#Obtaining a 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] にいくつか例が記載されています。 |
||
+ | === Generate a Curve25519 private key === |
||
− | ==鍵の生成== |
||
− | 鍵を生成する前に、保存するディレクトリを作成してください: |
||
− | $ mkdir -m0700 private |
||
− | 次に、あらかじめ鍵のパーミッションを設定しておきます: |
||
− | $ touch private/key.pem |
||
− | $ chmod 0600 private/key.pem |
||
− | もしくは [[umask]] を設定して新しく作成するファイルとディレクトリのパーティションを制限します: |
||
− | $ umask 077 |
||
+ | $ openssl genpkey -algorithm x25519 -out ''file'' |
||
− | {{ic|genpkey}} で鍵を生成する例: |
||
− | $ openssl genpkey -algorithm RSA -out private/key.pem -pkeyopt rsa_keygen_bits:4096 |
||
+ | === Generate an ECDSA private key === |
||
− | 鍵を暗号化したい場合、以下のコマンドを使って下さい。パスワードが要求されます: |
||
− | $ openssl genpkey -aes-256-cbc -algorithm RSA -out private/key.pem -pkeyopt rsa_keygen_bits:4096 |
||
+ | $ openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out ''file'' |
||
− | ==要求の作成== |
||
− | [http://www.cacert.org CAcert.org] などの公共の認証局や、ローカルで管理している認証局から証明書を取得するには、要求ファイルを CA に送信する必要があります。{{ic|csr}} ファイルと呼ばれます。 |
||
+ | === Generate an RSA private key === |
||
− | 新しい要求を作成して先に[[#鍵の生成|生成した鍵]]を使って署名してください: |
||
− | $ openssl req -new -sha256 -key private/key.pem -out req.csr |
||
+ | With {{man|1ssl|genpkey}}, which supersedes ''genrsa'' according to {{man|1ssl|openssl}}: |
||
− | ==証明書の署名== |
||
− | ローカルで CA の署名を行う方法を説明します: 直接、自己署名証明書を作成するか、ローカルの CA を利用します。 |
||
+ | $ openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:''keysize'' -out ''file'' |
||
− | ===自己署名証明書=== |
||
− | 自己署名証明書では動作しないプログラムは多数存在し、複数のシステムを自己署名証明書で管理する場合、[[#認証局|認証局]]をセットアップする方がずっとトラブルが少なくなります。 |
||
+ | If an encrypted key is desired, use the {{ic|-aes-256-cbc}} option. |
||
− | [[#鍵の生成|先に説明]]したとおりに鍵を生成した場合、次のコマンドを使って新しい証明書に署名します: |
||
− | $ openssl req -key private/key.pem -x509 -new -days 3650 -out cacert.pem |
||
+ | === Generate a certificate signing request === |
||
− | ===認証局=== |
||
− | [https://jamielinux.com/docs/openssl-certificate-authority/ OpenSSL Certificate Authority] には OpenSSL を CA として使用する詳しいガイドが載っています。 |
||
+ | Use {{man|1ssl|req}}: |
||
− | 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 req -new -sha256 -key ''private_key'' -out ''filename'' |
||
− | Makefile を作成するまえに、[[#設定]] に従って設定ファイルを作成してください。要求の作成ではなく CA の管理に関する指示に従って下さい。 |
||
+ | === Generate a self-signed certificate === |
||
− | ====Makefile==== |
||
− | {{ic|Makefile}} としてファイルに保存して、ファイルが存在するディレクトリで {{Ic|make}} を実行することで最初の CRL が生成されます: |
||
+ | $ openssl req -key ''private_key'' -x509 -new -days ''days'' -out ''filename'' |
||
− | {{bc|<nowiki> |
||
− | OPENSSL= openssl |
||
− | CNF= openssl.cnf |
||
− | CA= ${OPENSSL} ca -config ${CNF} |
||
− | REQ= ${OPENSSL} req -config ${CNF} |
||
+ | === Generate a self-signed certificate with private key in a single command === |
||
− | KEY= private/cakey.pem |
||
− | KEYMODE= RSA |
||
+ | You can combine the above command in OpenSSL into a single command which might be convenient in some cases: |
||
− | CACERT= cacert.pem |
||
− | CADAYS= 3650 |
||
+ | $ openssl req -x509 -newkey rsa:4096 -days ''days'' -keyout ''key_filename'' -out ''cert_filename'' |
||
− | CRL= crl.pem |
||
− | INDEX= index.txt |
||
− | SERIAL= serial |
||
+ | === Generate Diffie–Hellman parameters === |
||
+ | See [[Wikipedia:Diffie–Hellman key exchange|Diffie–Hellman key exchange]] for more information. |
||
− | CADEPS= ${CNF} ${KEY} ${CACERT} |
||
+ | 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]. |
||
− | all: ${CRL} |
||
+ | Alternatively you can generate a random group of your own: |
||
− | ${CRL}: ${CADEPS} |
||
− | ${CA} -gencrl -out ${CRL} |
||
+ | $ openssl dhparam -out ''filename'' ''2048'' |
||
− | ${CACERT}: ${CNF} ${KEY} |
||
− | ${REQ} -key ${KEY} -x509 -new -days ${CADAYS} -out ${CACERT} |
||
− | rm -f ${INDEX} |
||
− | touch ${INDEX} |
||
− | echo 100001 > ${SERIAL} |
||
+ | {{Tip|To speed up generating, especially when not on high-end hardware, add the {{ic|-dsaparam}} option [https://security.stackexchange.com/questions/95178/diffie-hellman-parameters-still-calculating-after-24-hours/95184#95184].}} |
||
− | ${KEY}: ${CNF} |
||
− | mkdir -m0700 -p $(dir ${KEY}) |
||
− | touch ${KEY} |
||
− | chmod 0600 ${KEY} |
||
− | ${OPENSSL} genpkey -algorithm ${KEYMODE} -out ${KEY} |
||
+ | === Show certificate information === |
||
+ | $ openssl x509 -text -in ''cert_filename'' |
||
− | revoke: ${CADEPS} ${item} |
||
− | @test -n $${item:?'usage: ${MAKE} revoke item=cert.pem'} |
||
− | ${CA} -revoke ${item} |
||
− | ${MAKE} ${CRL} |
||
+ | === Show certificate fingerprint === |
||
− | sign: ${CADEPS} ${item} |
||
− | @test -n $${item:?'usage: ${MAKE} sign item=request.csr'} |
||
− | mkdir -p newcerts |
||
− | ${CA} -in ${item} -out ${item:.csr=.crt} |
||
− | </nowiki>}} |
||
+ | $ openssl x509 -noout -in ''cert_filename'' -fingerprint ''-digest'' |
||
− | 証明書に署名するには: |
||
− | $ make sign item='''req.csr''' |
||
+ | {{ic|''-digest''}} is optional and one of {{ic|-md5}}, {{ic|-sha1}}, {{ic|-sha256}}, or {{ic|-sha512}}. See "-digest" in {{man|1ssl|x509|Input, Output, and General Purpose Options}} for when the digest is unspecified. |
||
− | 証明書を無効化するには: |
||
− | $ make revoke item='''cert.pem''' |
||
== トラブルシューティング == |
== トラブルシューティング == |
2022年5月6日 (金) 14:19時点における版
OpenSSL は SSL と TLS プロトコルのオープンソース実装で、OpenSSL (Apache License 1.0) と SSLeay (4-clause BSD) ライセンスのデュアルライセンスで配布されています。BSD, Linux, OpenVMS, Solaris, Windows などの様々なプラットフォームをサポートしています。
目次
- 1 Installation
- 2 Configuration
- 3 Usage
- 3.1 Generate a Curve25519 private key
- 3.2 Generate an ECDSA private key
- 3.3 Generate an RSA private key
- 3.4 Generate a certificate signing request
- 3.5 Generate a self-signed certificate
- 3.6 Generate a self-signed certificate with private key in a single command
- 3.7 Generate Diffie–Hellman parameters
- 3.8 Show certificate information
- 3.9 Show certificate fingerprint
- 4 トラブルシューティング
- 5 参照
Installation
openssl is installed by default on Arch Linux (as a dependency of coreutils).
There are various OpenSSL library bindings available for developers:
- python-pyopenssl
- perl-net-ssleay
- lua-sec, lua52-sec, lua51-sec
- haskell-hsopenssl
- haskell-openssl-streams
Configuration
On Arch Linux the OPENSSLDIR
is /etc/ssl
.
The OpenSSL configuration file, conventionally placed in /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 config(5ssl).
req section
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 Equifax:
$ openssl x509 -subject -noout < /etc/ssl/certs/Equifax_Secure_CA.pem
subject= /C=US/O=Equifax/OU=Equifax Secure Certificate Authority
Usage
This sections assumes you have read Transport Layer Security#Obtaining a certificate.
Generate a Curve25519 private key
$ openssl genpkey -algorithm x25519 -out file
Generate an ECDSA private key
$ openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out file
Generate an RSA private key
With genpkey(1ssl), which supersedes genrsa according to openssl(1ssl):
$ openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:keysize -out file
If an encrypted key is desired, use the -aes-256-cbc
option.
Generate a certificate signing request
Use req(1ssl):
$ openssl req -new -sha256 -key private_key -out filename
Generate a self-signed certificate
$ openssl req -key private_key -x509 -new -days days -out filename
Generate a self-signed certificate with private key in a single command
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
Generate Diffie–Hellman parameters
See Diffie–Hellman key exchange for more information.
Current best practice is to use one of the standard DH groups from RFC 7919, eg. ffdhe2048.
Alternatively you can generate a random group of your own:
$ openssl dhparam -out filename 2048
Show certificate information
$ openssl x509 -text -in cert_filename
Show certificate fingerprint
$ openssl x509 -noout -in cert_filename -fingerprint -digest
-digest
is optional and one of -md5
, -sha1
, -sha256
, or -sha512
. See "-digest" in x509(1ssl) § Input, Output, and General Purpose Options for when the digest is unspecified.
トラブルシューティング
復号時に "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 and "ca md too weak" errors
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 ssl
module level, ignoring the system-wide configuration of OpenSSL. It results sometimes in strange errors on older certificates, sometimes even when establishing 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)')))
To make Python follow the system configuration, you may have to rebuild it, adding --with-ssl-default-suites=openssl
parameter to ./configure
. The issue has been also reported as FS#73549.
参照
- Wikipedia の OpenSSL のページ
- OpenSSL プロジェクトページ
- FreeBSD ハンドブック
- 署名済みの SSL 証明書を作成するステップバイステップガイド
- OpenSSL Certificate Authority
- Bulletproof SSL and TLS by Ivan Ristić, a more formal introduction to SSL/TLS