Linuxコマンド辞典 opensslコマンド(セキュリティ)

SSLとTLSでの暗号や証明書を処理する「openssl」コマンドの概要と使い方を記載しています。

RHEL Fedora CentOS Vine Deblan Ubuntu Plamo

概要・使用方法

書式

$ openssl コマンド [オプション] [コマンド引数]

OpenSSLはSSL(Secure Socket Layer/SSLv2/SSLv3/TLS)の実装の1つです。opensslに機能ごとに分かれたコマンドと、コマンドそれぞれのオプションを指定することでSSL証明書の申請/発行/署名、暗号化/復号化、SSLサーバとクライアントのテスト、S/MIME署名や暗号化、乱数出力などが行えます。機能ごとのコマンドのマニュアルはmanで「man(セクション番号) ssl コマンド名」の形式で参照できます。

メッセージダイジェストは、出力、暗号化/復号化、SSL/TLSサーバとクライアントのテスト方法、認証局へのSSL証明書発行手順を扱います。

メッセージダイジェストは、ファイルや文字列などのメッセージから計算されて出力される固定文字列(ハッシュ値)です。これはハッシュ値から元メッセージへの変換ができないこと、元メッセージを変更すると出力が変わること、異なる元メッセージから同じハッシュ値を出力(衝突)しないことから、デジタル署名や改ざん検知などに利用されます。ユーザは、ソースコードアーカイブやディストリビューションのインストールイメージをダウンロードした後にハッシュ値を出力し、配布元が公開するとそれと比較することで、正常にダウンロードできたこと、改ざんされていないファイルを取得できたことを確認します。

コマンド

caCA(Certificate Authority、「認証局」)を処理する
crlCRL(Certificate Revocation List、「証明書失効リスト」)を処理する
dsa/rsaDSA/RSAを処理する
gendsa/genrsaDSA/RSA鍵を生成する
reqx.509 CSR(Certificate Signing Request、「証明書署名要求」)を処理する
x509X.509証明書を処理する
s_client/s_serverSSLクライアント/SSLサーバを起動する
pkcs12PKCS#12を処理する
enc共通鍵暗号で暗号化/復号化する
rsautlRSA鍵を使って暗号化/復号化する
md5MD5ダイジェストを出力する
sha1SHA1ダイジェストを出力する
verifyx.509証明書を検証する
randランダムな文字列を出力する
passwdパスワード文字列を出力する
smimeS/MIMEを処理する

オプション

ほとんどのコマンドで利用できるオプション

-informPEMかDERか入力形式を指定する
-outformPEMかDERか出力形式を指定する
-in入力ファイル名を指定する
-out出力ファイル名を指定する
-noout対象を出力しない
-textテキスト形式で表示する

ファイルのMD5チェックサムを表示する

$ openssl md5 ファイル名

実行結果

[rin@centos ~]$ openssl md5 test.txt
MD5(test.txt)= 3e7705498e8be60520841409ebc69bc1

ファイルのSHA-1チェックサムを表示する

$ openssl sha1 ファイル名

実行結果

[rin@centos ~]$ openssl sha1 test.txt
SHA1(test.txt)= dba7673010f19a94af4345453005933fd511bea9

利用できる暗号アルゴリズムを出力する

$ openssl ciphers

実行結果

[rin@centos ~]$ openssl ciphers
TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:
TLS_AES_128_CCM_SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:
ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-CCM:
ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-CCM:
ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:
ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES256-CCM:AES128-GCM-SHA256:
AES128-CCM:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DHE-RSA-AES256-GCM-SHA384:
DHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-CCM:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-CCM:
DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:
PSK-AES256-GCM-SHA384:PSK-CHACHA20-POLY1305:PSK-AES256-CCM:PSK-AES128-GCM-SHA256:
PSK-AES128-CCM:PSK-AES256-CBC-SHA:PSK-AES128-CBC-SHA256:PSK-AES128-CBC-SHA:
DHE-PSK-AES256-GCM-SHA384:DHE-PSK-CHACHA20-POLY1305:DHE-PSK-AES256-CCM:
DHE-PSK-AES128-GCM-SHA256:DHE-PSK-AES128-CCM:DHE-PSK-AES256-CBC-SHA:DHE-PSK-AES128-CBC-SHA256:
DHE-PSK-AES128-CBC-SHA:ECDHE-PSK-CHACHA20-POLY1305:ECDHE-PSK-AES256-CBC-SHA:
ECDHE-PSK-AES128-CBC-SHA256:ECDHE-PSK-AES128-CBC-SHA

opensslは共通鍵暗号と公開鍵暗号をサポートしています。まずはパスワードなど、暗号化する側と復号する側が共通の情報を持って暗号化されたデータをやりとりする、共通鍵暗号を使ってみましょう。encの後に暗号化アルゴリズムを指定できます。enc無しで「-(暗号化アルゴリズム名)」でも同じように動きます。利用できる暗号アルゴリズムはciphersで出力できます。

encに暗号化で利用する暗号アルゴリズムに「AES256-CBC」を指定し、-inオプションで対象ファイル名、-outオプションで暗号化されたファイル名を出力する

[rin@centos ~]$ openssl enc -aes-256-cbc -in test.txt -out ciphers.enc
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
[rin@centos ~]$ 

encに暗号アルゴリズムとして「AES256-CBC」を指定し、暗号化されたファイルを復号し、-outオプションで指定したファイルに出力する

[rin@centos ~]$ openssl enc -aes-256-cbc -d -in ciphers.enc -out ciphers
enter aes-256-cbc decryption password:

公開鍵暗号で秘密鍵と公開鍵をペアで作成して利用する方法

公開鍵暗号で秘密鍵と公開鍵をペアで作成して利用する暗号です。データを暗号化するには渡す人の公開鍵を利用し、復号するには自分の秘密鍵を利用します。

秘密鍵をgenrsa、公開鍵をrsaで生成する

[rin@centos ~]$ openssl genrsa -out server.key
Generating RSA private key, 2048 bit long modulus (2 primes)
........+++++
............................................................................................+++++
e is 65537 (0x010001)
[rin@centos ~]$ 

秘密鍵から公開鍵を作る

[rin@centos ~]$ openssl rsa -pubout -in server.key -out rin_server.pub
writing RSA key
[rin@centos ~]$ ls rin_server.pub 
rin_server.pub
[rin@centos ~]$ 

SSL証明書のサービス

SSL証明書を利用したサービスでは、秘密鍵と公開鍵を作成した後、公開鍵と所有者情報をつけ、認証局にそれが正しいものであるという署名をつけて発行してもらう必要があります。一般的な認証局に証明書を発行してもらうためには以下の手順が必要です。

  1. 鍵ペアを作成する
  2. CSR(Certificate Signing Request)を作成する
  3. 証明書を取得、秘密鍵とのペアを確認する
  4. 第三者認証局の証明書で検証する

以下のページでも手順を公開しています。

鍵長2048ビットの秘密鍵を作成する

$   openssl genrsa -out 秘密鍵ファイル名 暗号ビット数

実行結果

[rin@centos ~]$ openssl genrsa -out rsa.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
...................................................+++++
.............+++++
e is 65537 (0x010001)
[rin@centos ~]$ ls rsa.key 
rsa.key
[rin@centos ~]$ 

CSRを作成する

$  openssl req -new -key 生成した秘密鍵ファイル名 -out CSRファイル名 暗号アルゴリズム

実行結果

[centos@i-vhost work]$ openssl req -new -key server.key -out server.csr -sha256
Enter pass phrase for server.key:パスワードを入力
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) [XX]:国名 ※例:JP
State or Province Name (full name) []:都道府県 ※例:Tokyo
Locality Name (eg, city) [Default City]:市区町村 ※例:Chiyoda-ku
Organization Name (eg, company) [Default Company Ltd]: 組織名 ※例:Japan Reg Co., Ltd.
Organizational Unit Name (eg, section) []: 部署名 ※省略可
Common Name (eg, your name or your server's hostname) []:サーバー名 ※enjoy.com
Email Address []:空白 ※指定なし

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:空白 ※指定なし
An optional company name []:空白 ※指定なし
[centos@i-vhost work]$ ls
server.csr  server.key ※csrが造られる。
[centos@i-vhost work]$ 
[centos@i-vhost work]$ cat server.csr 
-----BEGIN CERTIFICATE REQUEST-----
↑から
↓までコピーする
-----END CERTIFICATE REQUEST-----

作成したファイル内の「—–BEGIN CERTIFICATE REQUEST—–」から「—–END CERTIFICATE REQUEST—–」をSSL証明書購入したWebサイトに貼り付けます。

証明書が届いたら内容の確認と、秘密鍵との関連が正しいかチェックします。

証明書の中身を確認する

証明書が届いたら内容の確認と、秘密鍵との関連が正しいかをチェックします。CSRを作った際の内容と違わないかチェックします。認証局によってはsubjectに文字列が挿入されている場合もある。

$  openssl x509 -in 証明書ファイル -noout -text

実行結果

[suna@engraku ~]$ openssl x509 -in server.crt -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            37:ed:91:b5:f2:ed:af:4b:7e:b1:3e:95:c1:2a:63:47
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=JP, O=Japan Registry Services Co., Ltd., CN=JPRS Domain Validation Authority - G4

証明書と秘密鍵の関係確認のためModulusを出力して文字を比較する

[suna@engraku ~]$ openssl rsa -in server.key -noout -text -modulus |grep Modulus
[suna@engraku ~]$ openssl x509 -in server.crt -noout -text -modulus | grep Modulus

SSL証明書を発行した認証局のCA証明書も併せて設置します。CA証明書を取得し、発行されたSSL証明書が認証局で署名されたものかを確認しましょう。

秘密鍵のパスフレーズを取り除く

秘密鍵をパスフレーズつきで暗号化している場合、Webサーバなどに組み込むと起動時にパスフレーズを問われるようになります。パスワード入力せずにWebサーバが再起動できるよう、秘密鍵を復号化する場合はrsaで復号して保存します。

$  openssl rsa -in 秘密鍵ファイル名 -out 出力先ファイル名

実行結果

[suna@engraku ~]$ openssl rsa -in server.key -out server_nopass.key
Enter pass phrase for server.key:
writing RSA key
[suna@engraku ~]$ 

PKCS#12形式からファイルを取り出す

認証局によっては秘密鍵、CA証明書、SSL証明書をまとめたPKCS#12形式のファイルを送ってくることがあります。これはたいてい暗号化されているので次のように証明書や秘密鍵を取り出します。

PKCS#12形式証明書からCA証明書を取り出す

$ openssl pkcs12 -in orcadas01.p12 -cacerts -nokeys -out cacerts.crt -nokeys -out cacerts.crt

PKCS#12形式証明書から秘密鍵を取り出す

$ openssl pkcs12 -in server.p12 -cacerts -nokeys -out cacerts.crt -out cacerts.crt

PKCS#12形式証明書からSSL証明書を取り出す

$ openssl pkcs12 -in server.p12 -clcerts -nokeys -out server.crt

HTTPS運用されているサーバに接続する

opensslはs_serverでSSLサーバとして、s_clientでクライアントとして接続するテストすることができます。サーバの証明書情報や認証局のCA証明書との関連、有効期限などを見ることができます。

$  openssl s_client -host 接続先ホスト -port ポート番号

実行結果

[suna@engraku ~]$ openssl s_client -host kcfran.com -port 443
CONNECTED(00000003)
depth=2 C = JP, O = "SECOM Trust Systems CO.,LTD.", OU = Security Communication RootCA2
verify return:1
depth=1 C = JP, O = "Japan Registry Services Co., Ltd.", CN = JPRS Domain Validation Authority - G4
verify return:1
depth=0 CN = kcfran.com
verify return:1
---