OpenSSL

提供: セキュリティ
2013年1月19日 (土) 14:15時点におけるDaemon (トーク | 投稿記録)による版

移動: 案内検索
スポンサーリンク

OpenSSLは、SSLプロトコル・TLSプロトコルのオープンソースの実装です。

読み方 おーぷんえすえすえる

概要

OpenSSLは、SSLプロトコル・TLSプロトコルのオープンソースの実装です。 暗号化関数やツールを提供しています。

インストール

  • FreeBSD では、デフォルトでインストールされています。

使い方

OpenSSLのコマンド

OpenSSLコマンドで使える「コマンド」は以下の通りです。

コマンド 説明
asn1parse ASN.1データを解析、表示します。
ca CAを扱います。
ciphers SSL/TLSで使用できる暗号スイート一覧を表示します。
crl 証明書失効リスト(CRL)を扱います。
crl2pkcs7 証明書失効リスト(CRL)をPKCS#7形式に変換します。
dgst メッセージダイジェストを計算します。
dh Diffie-Hellman パラメータを管理します。すでに obsolete なので dbparam を使って下さい。
dhparam Diffie-Hellman パラメータの生成と管理をします。
dsa DSA データを管理します。
dsaparam genpkey と pkeyparam に取って代わられました。
ec EC (Elliptic curve) key processing
ecparam EC パラメータの操作と生成をします。
enc 暗号化処理をします。
engine エンジン(ローダブルモジュール)情報と操作をします。
errstr エラー番号をエラー文字列に変換します。
gendh dhparam を使って下さい。
gendsa genpkey と pkey を使って下さい。
genrsa RSA 秘密鍵を生成します。 genpkey を使って下さい。
nseq netscape certificate sequence の生成と検証をします。
ocsp [Online_Certificate_Status_Protocol] ユーティリティです。
passwd ハッシュされたパスワードを生成します。
pkcs12 PKCS#12データを管理します。
pkcs7 PKCS#7データを管理します。
pkcs8 PKCS#8データを管理します。
prime 素数であるか調べます。
rand 乱数を生成します。
req PKCS#10 のデータを扱います。
rsa RSA Key を管理します。
rsautl 署名、検証、暗号化、復号のRSAユーティリティです。 pkeyutl を使って下さい。
s_client SSL/TLS でサーバに接続します。
s_server SSL/TLS で接続を受け付けるサーバとして起動します。
s_time SSL/TLS コネクションタイマ。
sess_id SSL セッションデータを管理します。
smime S/MIME メールを処理します。
speed アルゴリズム速度を計測します。
spkac SPKAC(Signed Public Key And Challenge) の表示と生成のユーティリティです。
verify X.509 公開鍵証明書を検証します。
version OpenSSLのバージョンを表示します。
x509 X.509 公開鍵証明書を操作します。


暗号スイートの一覧表示

SSL/TLSで使用できる暗号スイート一覧を表示する方法は、以下の通りです。 oepnssl ciphers

% openssl ciphers -v
DHE-RSA-AES256-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA1
DHE-DSS-AES256-SHA      SSLv3 Kx=DH       Au=DSS  Enc=AES(256)  Mac=SHA1
AES256-SHA              SSLv3 Kx=RSA      Au=RSA  Enc=AES(256)  Mac=SHA1
DHE-RSA-CAMELLIA256-SHA SSLv3 Kx=DH       Au=RSA  Enc=Camellia(256) Mac=SHA1
DHE-DSS-CAMELLIA256-SHA SSLv3 Kx=DH       Au=DSS  Enc=Camellia(256) Mac=SHA1
CAMELLIA256-SHA         SSLv3 Kx=RSA      Au=RSA  Enc=Camellia(256) Mac=SHA1
EDH-RSA-DES-CBC3-SHA    SSLv3 Kx=DH       Au=RSA  Enc=3DES(168) Mac=SHA1
EDH-DSS-DES-CBC3-SHA    SSLv3 Kx=DH       Au=DSS  Enc=3DES(168) Mac=SHA1
DES-CBC3-SHA            SSLv3 Kx=RSA      Au=RSA  Enc=3DES(168) Mac=SHA1
DES-CBC3-MD5            SSLv2 Kx=RSA      Au=RSA  Enc=3DES(168) Mac=MD5
DHE-RSA-AES128-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(128)  Mac=SHA1
DHE-DSS-AES128-SHA      SSLv3 Kx=DH       Au=DSS  Enc=AES(128)  Mac=SHA1
AES128-SHA              SSLv3 Kx=RSA      Au=RSA  Enc=AES(128)  Mac=SHA1
DHE-RSA-CAMELLIA128-SHA SSLv3 Kx=DH       Au=RSA  Enc=Camellia(128) Mac=SHA1
DHE-DSS-CAMELLIA128-SHA SSLv3 Kx=DH       Au=DSS  Enc=Camellia(128) Mac=SHA1
CAMELLIA128-SHA         SSLv3 Kx=RSA      Au=RSA  Enc=Camellia(128) Mac=SHA1
RC2-CBC-MD5             SSLv2 Kx=RSA      Au=RSA  Enc=RC2(128)  Mac=MD5
RC4-SHA                 SSLv3 Kx=RSA      Au=RSA  Enc=RC4(128)  Mac=SHA1
RC4-MD5                 SSLv3 Kx=RSA      Au=RSA  Enc=RC4(128)  Mac=MD5
RC4-MD5                 SSLv2 Kx=RSA      Au=RSA  Enc=RC4(128)  Mac=MD5
EDH-RSA-DES-CBC-SHA     SSLv3 Kx=DH       Au=RSA  Enc=DES(56)   Mac=SHA1
EDH-DSS-DES-CBC-SHA     SSLv3 Kx=DH       Au=DSS  Enc=DES(56)   Mac=SHA1
DES-CBC-SHA             SSLv3 Kx=RSA      Au=RSA  Enc=DES(56)   Mac=SHA1
DES-CBC-MD5             SSLv2 Kx=RSA      Au=RSA  Enc=DES(56)   Mac=MD5
EXP-EDH-RSA-DES-CBC-SHA SSLv3 Kx=DH(512)  Au=RSA  Enc=DES(40)   Mac=SHA1 export
EXP-EDH-DSS-DES-CBC-SHA SSLv3 Kx=DH(512)  Au=DSS  Enc=DES(40)   Mac=SHA1 export
EXP-DES-CBC-SHA         SSLv3 Kx=RSA(512) Au=RSA  Enc=DES(40)   Mac=SHA1 export
EXP-RC2-CBC-MD5         SSLv3 Kx=RSA(512) Au=RSA  Enc=RC2(40)   Mac=MD5  export
EXP-RC2-CBC-MD5         SSLv2 Kx=RSA(512) Au=RSA  Enc=RC2(40)   Mac=MD5  export
EXP-RC4-MD5             SSLv3 Kx=RSA(512) Au=RSA  Enc=RC4(40)   Mac=MD5  export
EXP-RC4-MD5             SSLv2 Kx=RSA(512) Au=RSA  Enc=RC4(40)   Mac=MD5  export

データの暗号化

メッセージダイジェストを計算する

OpenSSLコマンドでメッセージダイジェストを計算できます。

OpenSSLのdgstを使用します。dgstで使えるオプションは、通りです。

options are
-c              to output the digest with separating colons
-d              to output debug info
-hex            output as hex dump
-binary         output in binary form
-sign   file    sign digest using private key in file
-verify file    verify a signature using public key in file
-prverify file  verify a signature using private key in file
-keyform arg    key file format (PEM or ENGINE)
-signature file signature to verify
-binary         output in binary form
-hmac key       create hashed MAC with key
-engine e       use engine e, possibly a hardware device.
-md5            to use the md5 message digest algorithm (default)
-md4            to use the md4 message digest algorithm
-md2            to use the md2 message digest algorithm
-sha1           to use the sha1 message digest algorithm
-sha            to use the sha message digest algorithm
-sha224         to use the sha224 message digest algorithm
-sha256         to use the sha256 message digest algorithm
-sha384         to use the sha384 message digest algorithm
-sha512         to use the sha512 message digest algorithm
-mdc2           to use the mdc2 message digest algorithm
-ripemd160      to use the ripemd160 message digest algorithm

MD5 を計算する例です

% echo -n hoge | openssl dgst -md5
ea703e7aa1efda0064eaa507d9e8ab7e
% md5 -s hoge
MD5 ("hoge") = ea703e7aa1efda0064eaa507d9e8ab7e

SHA-1 を計算する例です。

% echo -n hoge | openssl dgst -sha1
31f30ddbcb1bf8446576f0e64aa4c88a9f055e3c
% sha1 -s hoge
SHA1 ("hoge") = 31f30ddbcb1bf8446576f0e64aa4c88a9f055e3c

SHA-2 を計算する例です。

% echo -n hoge | openssl dgst -sha256
ecb666d778725ec97307044d642bf4d160aabb76f56c0069c71ea25b1e926825
% echo -n hoge | openssl dgst -sha512
dbb50237ad3fa5b818b8eeca9ca25a047e0f29517db2b25f4a8db5f717ff90bf0b7e94ef4f5c4e313dfb06e48fbd9a2e40795906a75c470cdb619cf9c2d4f6d9

ファイルのメッセージダイジェストを計算する方法は、以下の通りです。

% openssl dgst -md5 /COPYRIGHT
MD5(/COPYRIGHT)= 8bf4da0bcda130c2fe3a41ab7bc48738
% openssl dgst -sha1 /COPYRIGHT
SHA1(/COPYRIGHT)= f16580cd8ab8c7ebc4fa0baa9e59ae8faf47f3ce
% openssl dgst -sha256 /COPYRIGHT
SHA256(/COPYRIGHT)= c73c367dd4c3c0b7e11cb241940c52e47bf4eb6f22001f1c9a792c28cb6093fd

ランダムデータの生成

OpenSSLコマンドを用いて、ランダムデータを生成できます。 100バイトのランダムデータと200バイトのランダムデータを作成する例です。

% openssl rand 100 -out /tmp/rand.100
% openssl rand 200 -out /tmp/rand.200
% ls -l /tmp/rand.???
-rw-r--r--  1 secure  wheel  100  119 13:18 /tmp/rand.100
-rw-r--r--  1 secure  wheel  200  119 13:18 /tmp/rand.200
% hexdump -C /tmp/rand.100 | head
00000000  08 c0 3e 58 99 6e b5 fc  7b 44 cc 09 66 7b d2 05  |..>X.n..{D..f{..|
00000010  35 cb 63 70 15 c0 ae 4d  df da 3b da 8a 14 a1 8a  |5.cp...M..;.....|
00000020  d4 9e f7 43 29 39 b4 51  4d 42 4d 33 9b d6 5e 0f  |...C)9.QMBM3..^.|
00000030  1c 8c ce 93 bf 57 62 45  cb 1b 66 50 b3 31 e8 af  |.....WbE..fP.1..|
00000040  e6 8e 2d 1f 44 60 08 b0  88 d0 7f 72 14 c2 7c fc  |..-.D`.....r..|.|
00000050  98 a4 ec 85 2a 54 aa 5f  aa 8a ce 41 98 9a 6c 0f  |....*T._...A..l.|
00000060  4a aa 6f 5b                                       |J.o[|
00000064

乱数をbase64でエンコードする場合には、-base64オプションを使用します。

% openssl rand 128 -out rand.txt -base64
% cat rand.txt
kB1p4ybkNhtP/aTDyg4jfITAILd+ysjX8EGZBmd6iCNMgVhlHcFHBZ3KRw+oaV7D
iSlp/MgCDb3fXN3EfyF0yQog4nmXU37PQmP5C7YoW3dCkPcVxdHXQzvS04yZ1qE/
SsBDUcvn4g8O+Fkqq59mBzCGymY2OR51Sbkt+uQyJRQ=


SSL/TLS でサーバに接続

% openssl s_client -connect google.com:443
CONNECTED(00000004)
depth=1 /C=US/O=Google Inc/CN=Google Internet Authority
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.google.com
   i:/C=US/O=Google Inc/CN=Google Internet Authority
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIF/DCCBWWgAwIBAgIKGIvRAgAAAAB3jzANBgkqhkiG9w0BAQUFADBGMQswCQYD
 
省略
 
si+tAo/VJDvoI61TzsqgyrJJtOq0gzyQ6GXWl3dX6qai9sOfB/p4HnQrcgWXaDf6
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.google.com
issuer=/C=US/O=Google Inc/CN=Google Internet Authority
---
No client certificate CA names sent
---
SSL handshake has read 2388 bytes and written 325 bytes
---
New, TLSv1/SSLv3, Cipher is RC4-SHA
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : RC4-SHA
    Session-ID: 689C4F8028D93C1F1350086145641B36593FAE0032BC1A0DAE5F35B2FBC35934
    Session-ID-ctx:
    Master-Key: FB2C1A4486171F4386B0507169D2009A29C52B0B0AEB1842D95828ADC154A7D7                                                                                                                                                                8C1E608BDC87789596891B65AD583B44
    Key-Arg   : None
    Start Time: 1358525542
    Timeout   : 300 (sec)
    Verify return code: 20 (unable to get local issuer certificate)
---

この状態では、入力待ちになります。ここで、終わらせてよければ、C-d を押します。

ここで、HTTPリクエストをタイプします。

GET / HTTP/1.0

HTTP リクエストをタイプして、Enterを2回押すと、リクエストが送信され、サーバからレスポンスが返ってきます。

---
GET / HTTP/1.0
 
HTTP/1.0 302 Found
Location: https://www.google.co.jp/
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Set-Cookie: PREF=ID=09c87f28f4622827:FF=0:TM=1358525980:LM=1358525980:S=t-wBwz-uG-gDr-5y; expires=Sun, 18-Jan-2015 16:19:40 GMT; path=/; domain=.google.com
Set-Cookie: NID=67=g8nsPGaG3o7zArGCN-OZ5AU-A4pRCxwwvL3doRhaBUML4Ty0XMZoJJEF73lNlRBMdHmShk0nM-tQJL8yDgl2XJ6G4LHqm95q8uavATsvUdp2LfVi1-WNc40NEcrh15jm; expires=Sat, 20-Jul-2013 16:19:40 GMT; path=/; domain=.google.com; HttpOnly
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
Date: Fri, 18 Jan 2013 16:19:40 GMT
Server: gws
Content-Length: 222
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="https://www.google.co.jp/">here</A>.
</BODY></HTML>
read:errno=0

アルゴリズムのベンチマーク

AES256 CBC のみのベンチマークの例。

% openssl speed aes-256-cbc
To get the most accurate results, try to run this
program when this computer is idle.
Doing aes-256 cbc for 3s on 16 size blocks: 26644419 aes-256 cbc's in 3.00s
Doing aes-256 cbc for 3s on 64 size blocks: 6817974 aes-256 cbc's in 3.00s
Doing aes-256 cbc for 3s on 256 size blocks: 1747901 aes-256 cbc's in 3.00s
Doing aes-256 cbc for 3s on 1024 size blocks: 438119 aes-256 cbc's in 3.00s
Doing aes-256 cbc for 3s on 8192 size blocks: 54924 aes-256 cbc's in 3.00s
OpenSSL 0.9.8q 2 Dec 2010
built on: date not available
options:bn(64,64) md2(int) rc4(ptr,int) des(idx,cisc,16,int) aes(partial) blowfish(idx)
compiler: cc
available timing options: USE_TOD HZ=128 [sysconf value]
timing function used: getrusage
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-256 cbc     141934.24k   145357.23k   149058.18k   149499.12k   149933.11k

複数コアでベンチマークするには、 -multi オプションを利用します。

2コアでベンチマークする例。

% openssl speed aes-256-cbc -multi 2
Forked child 0
Forked child 1
+DT:aes-256 cbc:3:16
+DT:aes-256 cbc:3:16
省略
Got: +H:16:64:256:1024:8192 from 0
Got: +F:18:aes-256 cbc:142927729.47:146718336.51:149192498.57:149494545.48:149924508.21 from 0
Got: +H:16:64:256:1024:8192 from 1
Got: +F:18:aes-256 cbc:142314800.64:145849564.52:149016131.98:149251262.67:149751893.71 from 1
OpenSSL 0.9.8q 2 Dec 2010
built on: date not available
options:bn(64,64) md2(int) rc4(ptr,int) des(idx,cisc,16,int) aes(partial) blowfish(idx)
compiler: cc
available timing options: USE_TOD HZ=128 [sysconf value]
timing function used:
aes-256 cbc     285242.53k   292567.90k   298208.63k   298745.81k   299676.40k

4コアでベンチマークする例。

% openssl speed aes-256-cbc -multi 4
Forked child 0
Forked child 1
Forked child 2
Forked child 3
+DT:aes-256 cbc:3:16
+DT:aes-256 cbc:3:16
+DT:aes-256 cbc:3:16
+DT:aes-256 cbc:3:16
省略
Got: +H:16:64:256:1024:8192 from 0
Got: +F:18:aes-256 cbc:142448708.50:146151125.69:148574372.19:148713525.93:14876                                                                                                                                                                4852.36 from 0
Got: +H:16:64:256:1024:8192 from 1
Got: +F:18:aes-256 cbc:142336001.45:146838464.42:149228172.59:148385577.78:14870                                                                                                                                                                6505.63 from 1
Got: +H:16:64:256:1024:8192 from 2
Got: +F:18:aes-256 cbc:142373567.22:145615575.87:148375546.06:149543690.71:14997                                                                                                                                                                9884.12 from 2
Got: +H:16:64:256:1024:8192 from 3
Got: +F:18:aes-256 cbc:142207526.24:145817908.91:147647012.58:149520545.13:14995                                                                                                                                                                4244.09 from 3
OpenSSL 0.9.8q 2 Dec 2010
built on: date not available
options:bn(64,64) md2(int) rc4(ptr,int) des(idx,cisc,16,int) aes(partial) blowfi                                                                                                                                                                sh(idx)
compiler: cc
available timing options: USE_TOD HZ=128 [sysconf value]
timing function used:
aes-256 cbc     569365.80k   584423.07k   593825.10k   596163.34k   597405.49k

コア数が1,2,4の場合のAES256 CBCのベンチマークの結果は、以下の通りです。 コア数によって、スケールしています。

1 aes-256 cbc     141934.24k   145357.23k   149058.18k   149499.12k   149933.11k
2 aes-256 cbc     285242.53k   292567.90k   298208.63k   298745.81k   299676.40k
4 aes-256 cbc     569365.80k   584423.07k   593825.10k   596163.34k   597405.49k

AESDESのベンチマーク。 AES/DESの中では、AES128が一番速いことがわかります。

% openssl speed des aes
To get the most accurate results, try to run this
program when this computer is idle.
Doing des cbc for 3s on 16 size blocks: 14092418 des cbc's in 3.00s
Doing des cbc for 3s on 64 size blocks: 3643765 des cbc's in 3.00s
Doing des cbc for 3s on 256 size blocks: 922499 des cbc's in 3.00s
Doing des cbc for 3s on 1024 size blocks: 231401 des cbc's in 3.00s
Doing des cbc for 3s on 8192 size blocks: 28959 des cbc's in 3.00s
Doing des ede3 for 3s on 16 size blocks: 5485953 des ede3's in 3.00s
Doing des ede3 for 3s on 64 size blocks: 1395227 des ede3's in 3.00s
Doing des ede3 for 3s on 256 size blocks: 350945 des ede3's in 3.00s
Doing des ede3 for 3s on 1024 size blocks: 87872 des ede3's in 3.00s
Doing des ede3 for 3s on 8192 size blocks: 10989 des ede3's in 3.00s
Doing aes-128 cbc for 3s on 16 size blocks: 33019235 aes-128 cbc's in 3.00s
Doing aes-128 cbc for 3s on 64 size blocks: 8527441 aes-128 cbc's in 3.00s
Doing aes-128 cbc for 3s on 256 size blocks: 2178696 aes-128 cbc's in 3.00s
Doing aes-128 cbc for 3s on 1024 size blocks: 546011 aes-128 cbc's in 3.00s
Doing aes-128 cbc for 3s on 8192 size blocks: 68902 aes-128 cbc's in 3.00s
Doing aes-192 cbc for 3s on 16 size blocks: 29581370 aes-192 cbc's in 3.00s
Doing aes-192 cbc for 3s on 64 size blocks: 7658872 aes-192 cbc's in 3.00s
Doing aes-192 cbc for 3s on 256 size blocks: 1948313 aes-192 cbc's in 3.00s
Doing aes-192 cbc for 3s on 1024 size blocks: 488291 aes-192 cbc's in 3.00s
Doing aes-192 cbc for 3s on 8192 size blocks: 61234 aes-192 cbc's in 3.00s
Doing aes-256 cbc for 3s on 16 size blocks: 26695719 aes-256 cbc's in 3.00s
Doing aes-256 cbc for 3s on 64 size blocks: 6887725 aes-256 cbc's in 3.00s
Doing aes-256 cbc for 3s on 256 size blocks: 1747932 aes-256 cbc's in 3.00s
Doing aes-256 cbc for 3s on 1024 size blocks: 438203 aes-256 cbc's in 3.00s
Doing aes-256 cbc for 3s on 8192 size blocks: 54925 aes-256 cbc's in 3.00s
OpenSSL 0.9.8q 2 Dec 2010
built on: date not available
options:bn(64,64) md2(int) rc4(ptr,int) des(idx,cisc,16,int) aes(partial) blowfi                                                                                                                                                                sh(idx)
compiler: cc
available timing options: USE_TOD HZ=128 [sysconf value]
timing function used: getrusage
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
des cbc          75073.95k    77684.01k    78669.33k    78934.20k    79025.72k
des ede3         29240.03k    29745.69k    29928.10k    29974.21k    29987.16k
aes-128 cbc     175996.34k   181801.96k   185796.23k   186251.99k   188025.30k
aes-192 cbc     157721.41k   163338.74k   166204.52k   166618.29k   167156.88k
aes-256 cbc     142333.85k   146892.55k   149110.69k   149526.79k   149932.79k

AES-NIが利用できる場合は、以下のオプションを追加します。

openssl speed -engine aesni -evp aes-256-cbc

関連項目




スポンサーリンク