openssl
centos7

opensslコマンドの使い方


1 環境

VMware Workstation 12 Player上の仮想マシンを使っています。

仮想マシンはサーバとクライアントの2台構成です。

サーバ、クライアントともに下記設定です。

[root@server ~]# cat /etc/redhat-release

CentOS Linux release 7.3.1611 (Core)

[root@server ~]# uname -r
3.10.0-514.el7.x86_64

[root@server ~]# cat /etc/hosts
192.168.0.10 server
192.168.0.110 client


2 事前準備


2.1 opensslのインストール

サーバにopensslパッケージをインストールする。

[root@server ~]# yum -y install openssl
[root@server ~]# openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017

クライアントにopensslパッケージをインストールする。
[root@client ~]# yum -y install openssl
[root@client ~]# openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017


3 opensslのコマンド表示方法

man opensslより引用したopensslの書式を以下に示します。


opensslの書式

openssl command [ command_opts ] [ command_args ]


opensslには、多数のコマンド(上記のcommandの部分)が存在します。

ここでは、どのようなコマンドが存在するのかを確認する方法について説明します。

コマンドの分類として、大きく以下のものがあります。

・標準コマンド(list-standard-commands)

・メッセージダイジェストのコマンド(list-message-digest-commands)

・暗号スイートのコマンド(list-cipher-commands)

・暗号スイートのアルゴリズムに関するコマンド(list-cipher-algorithms)

・メッセージダイジェストのアルゴリズムに関するコマンド(list-message-digest-algorithms)

・公開鍵のアルゴリズムに関するコマンド(list-public-key-algorithms)


3.1 標準コマンドの表示方法(list-standard-commands)

標準コマンドを表示する。asn1parse,ca,ciphers等の標準コマンドがあることがわかります。

また、man asn1parse と実行するとマニュアルを表示することができます。
[root@server ~]# openssl list-standard-commands
asn1parse
ca
ciphers
-以下、略-


3.2 メッセージダイジェストのコマンドを表示する方法(list-message-digest-commands)

メッセージダイジェストのコマンドを表示する。

md2,md4,md5等のメッセージダイジェス関連のコマンドがあることがわかります。
また、man md2 と実行するとマニュアルを表示することができます。
[root@server ~]# openssl list-message-digest-commands
md2
md4
md5
-以下、略-


3.3 暗号スイートのコマンドを表示する方法(list-cipher-commands)

暗号スイートのコマンドを表示する。

aes-128-cbc,aes-128-ecb,aes-192-cbc等のメッセージダイジェス関連のコマンドがあることがわかります。
[root@server ~]# openssl list-cipher-commands
aes-128-cbc
aes-128-ecb
aes-192-cbc
-以下、略-


4 genrsaコマンドの使い方

標準コマンドの中に、genrsaコマンドがあります。

genrsaは、RSA公開鍵暗号方式で使用するコマンドです。


4.1 manの使い方

[root@server ~]# man rsa

RSA(1) OpenSSL RSA(1)

NAME
rsa - RSA key processing tool

SYNOPSIS
openssl rsa [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-sgckey] [-aes128]
[-aes192] [-aes256] [-camellia128] [-camellia192] [-camellia256] [-des] [-des3] [-idea] [-text] [-noout] [-modulus] [-check] [-pubin] [-pubout]
[-RSAPublicKey_in] [-RSAPublicKey_out] [-engine id]


4.2 RSA秘密鍵の生成方法

2048bitのRSA秘密鍵を生成する。

root@server ~]# openssl genrsa -out private.key 2048
Generating RSA private key, 2048 bit long modulus
...............................+++
.....+++
e is 65537 (0x10001)

[root@server ~]# file private.key
private.key: PEM RSA private key

作成した秘密鍵は、他人に読まれてはいけないので、以下のようにパミッションを設定する。
[root@server ~]# chmod 400 private.key
[root@server ~]# ls -l private.key
-r-------- 1 root root 1679 1月 8 21:38 private.key

生成した秘密鍵の中身を確認する。BEGINとENDの間が秘密鍵になる。
[root@server ~]# cat private.key
-----BEGIN RSA PRIVATE KEY-----
(中略)
-----END RSA PRIVATE KEY-----


4.3 RSA公開鍵の生成方法(-pubout)

秘密鍵(private.key)に対する公開鍵(public.key)を作成します。

秘密鍵は、4.2で生成したものを使います。

[root@server ~]# openssl rsa -in private.key -out public.key -pubout

writing RSA key

[root@server ~]# file public.key
public.key: ASCII text


4.4 秘密鍵を暗号化する方法

秘密鍵をファイルにそのまま保存しておくのはあまり良くありません。

もし秘密鍵が盗まれると、暗号通信が全て解読できてしまうからです。

そこで 秘密鍵を共通鍵暗号で暗号化して、もし盗まれても秘密鍵が利用できないようにしておきます。

ここでは、秘密鍵をAES共通鍵暗号方式で暗号化する方法を説明します。

[root@server ~]# openssl genrsa -out private.key -aes256 2048

Generating RSA private key, 2048 bit long modulus
......................................+++
......+++
e is 65537 (0x10001)
Enter pass phrase for private.key: ★パスフレーズを入力する。
Verifying - Enter pass phrase for private.key: ★もう一度、パスフレーズを入力する。

生成した秘密鍵の中身を確認する。
[root@server ~]# cat private.key
-----BEGIN RSA PRIVATE KEY-----
(中略)
-----END RSA PRIVATE KEY-----


5 s_clientコマンドの使い方

標準コマンドの中に、s_clientコマンドがあります。

s_clientコマンドは、TLSサーバに接続するためのTLSクライアントとして動作します。


5.1 manの使い方

[root@server ~]# man s_client

S_CLIENT(1) OpenSSL S_CLIENT(1)

NAME
s_client - SSL/TLS client program

SYNOPSIS
openssl s_client [-connect host:port] [-servername name] [-verify depth] [-verify_return_error] [-cert filename] [-certform DER|PEM] [-key
filename] [-keyform DER|PEM] [-pass arg] [-CApath directory] [-CAfile filename] [-trusted_first] [-no_alt_chains] [-reconnect] [-pause]
[-showcerts] [-debug] [-msg] [-nbio_test] [-state] [-nbio] [-crlf] [-ign_eof] [-no_ign_eof] [-quiet] [-ssl3] [-tls1] [-tls1_1] [-tls1_2] [-dtls1]
[-no_ssl3] [-no_tls1] [-no_tls1_1] [-no_tls1_2] [-fallback_scsv] [-bugs] [-cipher cipherlist] [-krb5svc service] [-serverpref] [-starttls
protocol] [-xmpphost hostname] [-name hostname] [-engine id] [-tlsextdebug] [-no_ticket] [-sess_out filename] [-sess_in filename] [-rand file(s)]
[-serverinfo types] [-status] [-alpn protocols] [-nextprotoneg protocols]


5.2 TLSサーバに接続する方法(-connect)

connectオプションを使って、www.example.comというサーバにTLSで接続してみます。

なお、example.comはIANAが予約しているドメインです。

[root@client ~]# openssl s_client -connect www.example.com:443

CONNECTED(00000003)
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert High Assurance EV Root CA
verify return:1
depth=1 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert SHA2 High Assurance Server CA
verify return:1
depth=0 C = US, ST = California, L = Los Angeles, O = Internet Corporation for Assigned Names and Numbers, OU = Technology, CN = www.example.org
verify return:1
---
Certificate chain
0 s:/C=US/ST=California/L=Los Angeles/O=Internet Corporation for Assigned Names and Numbers/OU=Technology/CN=www.example.org
i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 High Assurance Server CA
1 s:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 High Assurance Server CA
i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV Root CA
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIF8jCCBNqgAwIBAgIQDmTF+8I2reFLFyrrQceMsDANBgkqhkiG9w0BAQsFADBw
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMS8wLQYDVQQDEyZEaWdpQ2VydCBTSEEyIEhpZ2ggQXNz
dXJhbmNlIFNlcnZlciBDQTAeFw0xNTExMDMwMDAwMDBaFw0xODExMjgxMjAwMDBa
MIGlMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEUMBIGA1UEBxML
TG9zIEFuZ2VsZXMxPDA6BgNVBAoTM0ludGVybmV0IENvcnBvcmF0aW9uIGZvciBB
c3NpZ25lZCBOYW1lcyBhbmQgTnVtYmVyczETMBEGA1UECxMKVGVjaG5vbG9neTEY
MBYGA1UEAxMPd3d3LmV4YW1wbGUub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEAs0CWL2FjPiXBl61lRfvvE0KzLJmG9LWAC3bcBjgsH6NiVVo2dt6u
Xfzi5bTm7F3K7srfUBYkLO78mraM9qizrHoIeyofrV/n+pZZJauQsPjCPxMEJnRo
D8Z4KpWKX0LyDu1SputoI4nlQ/htEhtiQnuoBfNZxF7WxcxGwEsZuS1KcXIkHl5V
RJOreKFHTaXcB1qcZ/QRaBIv0yhxvK1yBTwWddT4cli6GfHcCe3xGMaSL328Fgs3
jYrvG29PueB6VJi/tbbPu6qTfwp/H1brqdjh29U52Bhb0fJkM9DWxCP/Cattcc7a
z8EXnCO+LK8vkhw/kAiJWPKx4RBvgy73nwIDAQABo4ICUDCCAkwwHwYDVR0jBBgw
FoAUUWj/kK8CB3U8zNllZGKiErhZcjswHQYDVR0OBBYEFKZPYB4fLdHn8SOgKpUW
5Oia6m5IMIGBBgNVHREEejB4gg93d3cuZXhhbXBsZS5vcmeCC2V4YW1wbGUuY29t
ggtleGFtcGxlLmVkdYILZXhhbXBsZS5uZXSCC2V4YW1wbGUub3Jngg93d3cuZXhh
bXBsZS5jb22CD3d3dy5leGFtcGxlLmVkdYIPd3d3LmV4YW1wbGUubmV0MA4GA1Ud
DwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwdQYDVR0f
BG4wbDA0oDKgMIYuaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL3NoYTItaGEtc2Vy
dmVyLWc0LmNybDA0oDKgMIYuaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL3NoYTIt
aGEtc2VydmVyLWc0LmNybDBMBgNVHSAERTBDMDcGCWCGSAGG/WwBATAqMCgGCCsG
AQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BTMAgGBmeBDAECAjCB
gwYIKwYBBQUHAQEEdzB1MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy
dC5jb20wTQYIKwYBBQUHMAKGQWh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9E
aWdpQ2VydFNIQTJIaWdoQXNzdXJhbmNlU2VydmVyQ0EuY3J0MAwGA1UdEwEB/wQC
MAAwDQYJKoZIhvcNAQELBQADggEBAISomhGn2L0LJn5SJHuyVZ3qMIlRCIdvqe0Q
6ls+C8ctRwRO3UU3x8q8OH+2ahxlQmpzdC5al4XQzJLiLjiJ2Q1p+hub8MFiMmVP
PZjb2tZm2ipWVuMRM+zgpRVM6nVJ9F3vFfUSHOb4/JsEIUvPY+d8/Krc+kPQwLvy
ieqRbcuFjmqfyPmUv1U9QoI4TQikpw7TZU0zYZANP4C/gj4Ry48/znmUaRvy2kvI
l7gRQ21qJTK5suoiYoYNo3J9T+pXPGU7Lydz/HwW+w0DpArtAaukI8aNX4ohFUKS
wDSiIIWIWJiJGbEeIO0TIFwEVWTOnbNl/faPXpk5IRXicapqiII=
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Los Angeles/O=Internet Corporation for Assigned Names and Numbers/OU=Technology/CN=www.example.org
issuer=/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 High Assurance Server CA
---
No client certificate CA names sent
Server Temp Key: ECDH, prime256v1, 256 bits
---
SSL handshake has read 3388 bytes and written 373 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES128-GCM-SHA256
Session-ID: 80EAD856BB9661CBE25D1A7BB3D36A873471A5AEF3E49FF66034231F5FE63A53
Session-ID-ctx:
Master-Key: 0AF098393C144CE04554443088C855679C2001859E1C98B8A206488A092933B6FC02A3547C90878C1CF256E37EF4E6CA
Key-Arg : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
TLS session ticket lifetime hint: 7200 (seconds)
TLS session ticket:
0000 - 1a 83 4e 21 71 06 d2 43-d6 98 17 bb a7 0c 2c 4e ..N!q..C......,N
0010 - 68 46 0e 40 b0 86 07 62-e1 b4 9a a4 3f 19 32 d7 hF.@...b....?.2.
0020 - 13 d4 b9 f5 46 31 ab b0-10 c3 0b 56 fe 97 a3 c4 ....F1.....V....
0030 - 9e 27 9c 64 b9 8c af 27-da 69 ae e1 f3 f9 c1 b1 .'.d...'.i......
0040 - ce 53 5a a4 e1 01 6c ac-12 73 be af 71 e1 d7 c0 .SZ...l..s..q...
0050 - cd af d5 c2 22 ee 29 54-0d e3 a7 03 ce c2 ac 94 ....".)T........
0060 - 1c 74 96 ad f0 e7 21 b0-65 9d 67 62 28 9f 21 44 .t....!.e.gb(.!D
0070 - 20 d5 53 ac 0d da cc 28-8e b8 04 08 a0 c2 b9 bf .S....(........
0080 - f1 a1 6f 5e 04 98 31 8c-6b 1c 47 5e 26 63 b1 90 ..o^..1.k.G^&c..
0090 - 7c c9 4b f7 6c cd f3 48-4f fb f1 da 5a 31 bf 43 |.K.l..HO...Z1.C

Start Time: 1514378109
Timeout : 300 (sec)
Verify return code: 0 (ok)
---


5.3 実行結果を簡潔に表示する方法(-brief)

[root@server ~]# openssl s_client -connect www.example.com:443 -brief

CONNECTION ESTABLISHED
Protocol version: TLSv1.2
Ciphersuite: ECDHE-RSA-AES128-GCM-SHA256
Peer certificate: C = US, ST = California, L = Los Angeles, O = Internet Corporation for Assigned Names and Numbers, OU = Technology, CN = www.example.org
Hash used: SHA512
Supported Elliptic Curve Point Formats: uncompressed:ansiX962_compressed_prime:ansiX962_compressed_char2
Server Temp Key: ECDH, P-256, 256 bits


5.4 TLSバージョンを指定してTLSサーバに接続する方法


TLS1で接続する方法(-tls1)

[root@server ~]# openssl s_client -connect www.example.com:443 -tls1 -brief

CONNECTION ESTABLISHED
Protocol version: TLSv1
Ciphersuite: ECDHE-RSA-AES128-SHA
Peer certificate: C = US, ST = California, L = Los Angeles, O = Internet Corporation for Assigned Names and Numbers, OU = Technology, CN = www.example.org
Supported Elliptic Curve Point Formats: uncompressed:ansiX962_compressed_prime:ansiX962_compressed_char2
Server Temp Key: ECDH, P-256, 256 bits


TLS1.1で接続する方法(-tls1_1)

[root@server ~]# openssl s_client -connect www.example.com:443 -tls1_1 -brief

CONNECTION ESTABLISHED
Protocol version: TLSv1.1
Ciphersuite: ECDHE-RSA-AES128-SHA
Peer certificate: C = US, ST = California, L = Los Angeles, O = Internet Corporation for Assigned Names and Numbers, OU = Technology, CN = www.example.org
Supported Elliptic Curve Point Formats: uncompressed:ansiX962_compressed_prime:ansiX962_compressed_char2
Server Temp Key: ECDH, P-256, 256 bits


TLS1.2で接続する方法(-tls1_2)

[root@server ~]# openssl s_client -connect www.example.com:443 -tls1_2 -brief

CONNECTION ESTABLISHED
Protocol version: TLSv1.2
Ciphersuite: ECDHE-RSA-AES128-GCM-SHA256
Peer certificate: C = US, ST = California, L = Los Angeles, O = Internet Corporation for Assigned Names and Numbers, OU = Technology, CN = www.example.org
Hash used: SHA512
Supported Elliptic Curve Point Formats: uncompressed:ansiX962_compressed_prime:ansiX962_compressed_char2
Server Temp Key: ECDH, P-256, 256 bits

現在、SSL3は使用禁止になっているので、TLSサーバにSSL3で接続しようとすると、エラーになります。


SSL3で接続する方法(-ssl3)

SSL3で接続する。エラーになることがわかる。

[root@server ~]# openssl s_client -connect www.example.com:443 -ssl3 -brief
140118092027808:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:s3_pkt.c:1493:SSL alert number 40
140118092027808:error:1409E0E5:SSL routines:ssl3_write_bytes:ssl handshake failure:s3_pkt.c:659:


5.5 証明書チェインの表示方法(-showcerts)

ルートCAに至るまでの証明書チェインを確認してみます。

depth=2がルートCA、depth=1が中間CA、depth=0がwww.example.comのサーバ証明書になります。

[root@client ~]# openssl s_client -connect www.example.com:443 -showcerts < /dev/null

CONNECTED(00000003)
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert High Assurance EV Root CA
verify return:1
depth=1 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert SHA2 High Assurance Server CA
verify return:1
depth=0 C = US, ST = California, L = Los Angeles, O = Internet Corporation for Assigned Names and Numbers, OU = Technology, CN = www.example.org
verify return:1
---
Certificate chain
0 s:/C=US/ST=California/L=Los Angeles/O=Internet Corporation for Assigned Names and Numbers/OU=Technology/CN=www.example.org
i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 High Assurance Server CA
-----BEGIN CERTIFICATE-----
MIIF8jCCBNqgAwIBAgIQDmTF+8I2reFLFyrrQceMsDANBgkqhkiG9w0BAQsFADBw
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMS8wLQYDVQQDEyZEaWdpQ2VydCBTSEEyIEhpZ2ggQXNz
dXJhbmNlIFNlcnZlciBDQTAeFw0xNTExMDMwMDAwMDBaFw0xODExMjgxMjAwMDBa
MIGlMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEUMBIGA1UEBxML
TG9zIEFuZ2VsZXMxPDA6BgNVBAoTM0ludGVybmV0IENvcnBvcmF0aW9uIGZvciBB
c3NpZ25lZCBOYW1lcyBhbmQgTnVtYmVyczETMBEGA1UECxMKVGVjaG5vbG9neTEY
MBYGA1UEAxMPd3d3LmV4YW1wbGUub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEAs0CWL2FjPiXBl61lRfvvE0KzLJmG9LWAC3bcBjgsH6NiVVo2dt6u
Xfzi5bTm7F3K7srfUBYkLO78mraM9qizrHoIeyofrV/n+pZZJauQsPjCPxMEJnRo
D8Z4KpWKX0LyDu1SputoI4nlQ/htEhtiQnuoBfNZxF7WxcxGwEsZuS1KcXIkHl5V
RJOreKFHTaXcB1qcZ/QRaBIv0yhxvK1yBTwWddT4cli6GfHcCe3xGMaSL328Fgs3
jYrvG29PueB6VJi/tbbPu6qTfwp/H1brqdjh29U52Bhb0fJkM9DWxCP/Cattcc7a
z8EXnCO+LK8vkhw/kAiJWPKx4RBvgy73nwIDAQABo4ICUDCCAkwwHwYDVR0jBBgw
FoAUUWj/kK8CB3U8zNllZGKiErhZcjswHQYDVR0OBBYEFKZPYB4fLdHn8SOgKpUW
5Oia6m5IMIGBBgNVHREEejB4gg93d3cuZXhhbXBsZS5vcmeCC2V4YW1wbGUuY29t
ggtleGFtcGxlLmVkdYILZXhhbXBsZS5uZXSCC2V4YW1wbGUub3Jngg93d3cuZXhh
bXBsZS5jb22CD3d3dy5leGFtcGxlLmVkdYIPd3d3LmV4YW1wbGUubmV0MA4GA1Ud
DwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwdQYDVR0f
BG4wbDA0oDKgMIYuaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL3NoYTItaGEtc2Vy
dmVyLWc0LmNybDA0oDKgMIYuaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL3NoYTIt
aGEtc2VydmVyLWc0LmNybDBMBgNVHSAERTBDMDcGCWCGSAGG/WwBATAqMCgGCCsG
AQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BTMAgGBmeBDAECAjCB
gwYIKwYBBQUHAQEEdzB1MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy
dC5jb20wTQYIKwYBBQUHMAKGQWh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9E
aWdpQ2VydFNIQTJIaWdoQXNzdXJhbmNlU2VydmVyQ0EuY3J0MAwGA1UdEwEB/wQC
MAAwDQYJKoZIhvcNAQELBQADggEBAISomhGn2L0LJn5SJHuyVZ3qMIlRCIdvqe0Q
6ls+C8ctRwRO3UU3x8q8OH+2ahxlQmpzdC5al4XQzJLiLjiJ2Q1p+hub8MFiMmVP
PZjb2tZm2ipWVuMRM+zgpRVM6nVJ9F3vFfUSHOb4/JsEIUvPY+d8/Krc+kPQwLvy
ieqRbcuFjmqfyPmUv1U9QoI4TQikpw7TZU0zYZANP4C/gj4Ry48/znmUaRvy2kvI
l7gRQ21qJTK5suoiYoYNo3J9T+pXPGU7Lydz/HwW+w0DpArtAaukI8aNX4ohFUKS
wDSiIIWIWJiJGbEeIO0TIFwEVWTOnbNl/faPXpk5IRXicapqiII=
-----END CERTIFICATE-----
1 s:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 High Assurance Server CA
i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV Root CA
-----BEGIN CERTIFICATE-----
MIIEsTCCA5mgAwIBAgIQBOHnpNxc8vNtwCtCuF0VnzANBgkqhkiG9w0BAQsFADBs
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
ZSBFViBSb290IENBMB4XDTEzMTAyMjEyMDAwMFoXDTI4MTAyMjEyMDAwMFowcDEL
MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
LmRpZ2ljZXJ0LmNvbTEvMC0GA1UEAxMmRGlnaUNlcnQgU0hBMiBIaWdoIEFzc3Vy
YW5jZSBTZXJ2ZXIgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC2
4C/CJAbIbQRf1+8KZAayfSImZRauQkCbztyfn3YHPsMwVYcZuU+UDlqUH1VWtMIC
Kq/QmO4LQNfE0DtyyBSe75CxEamu0si4QzrZCwvV1ZX1QK/IHe1NnF9Xt4ZQaJn1
itrSxwUfqJfJ3KSxgoQtxq2lnMcZgqaFD15EWCo3j/018QsIJzJa9buLnqS9UdAn
4t07QjOjBSjEuyjMmqwrIw14xnvmXnG3Sj4I+4G3FhahnSMSTeXXkgisdaScus0X
sh5ENWV/UyU50RwKmmMbGZJ0aAo3wsJSSMs5WqK24V3B3aAguCGikyZvFEohQcft
bZvySC/zA/WiaJJTL17jAgMBAAGjggFJMIIBRTASBgNVHRMBAf8ECDAGAQH/AgEA
MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw
NAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy
dC5jb20wSwYDVR0fBEQwQjBAoD6gPIY6aHR0cDovL2NybDQuZGlnaWNlcnQuY29t
L0RpZ2lDZXJ0SGlnaEFzc3VyYW5jZUVWUm9vdENBLmNybDA9BgNVHSAENjA0MDIG
BFUdIAAwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQ
UzAdBgNVHQ4EFgQUUWj/kK8CB3U8zNllZGKiErhZcjswHwYDVR0jBBgwFoAUsT7D
aQP4v0cB1JgmGggC72NkK8MwDQYJKoZIhvcNAQELBQADggEBABiKlYkD5m3fXPwd
aOpKj4PWUS+Na0QWnqxj9dJubISZi6qBcYRb7TROsLd5kinMLYBq8I4g4Xmk/gNH
E+r1hspZcX30BJZr01lYPf7TMSVcGDiEo+afgv2MW5gxTs14nhr9hctJqvIni5ly
/D6q1UEL2tU2ob8cbkdJf17ZSHwD2f2LSaCYJkJA69aSEaRkCldUxPUd1gJea6zu
xICaEnL6VpPX/78whQYwvwt/Tv9XBZ0k7YXDK/umdaisLRbvfXknsuvCnQsH6qqF
0wGjIChBWUMo0oHjqvbsezt3tkBigAVBRQHvFwY+3sAzm2fTYS5yh+Rp/BIAV0Ae
cPUeybQ=
-----END CERTIFICATE-----
---
Server certificate
subject=/C=US/ST=California/L=Los Angeles/O=Internet Corporation for Assigned Names and Numbers/OU=Technology/CN=www.example.org
issuer=/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 High Assurance Server CA
---
No client certificate CA names sent
Server Temp Key: ECDH, prime256v1, 256 bits
---
SSL handshake has read 3388 bytes and written 373 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES128-GCM-SHA256
Session-ID: E28E40AE4582F246B2B4DC1BC551E5B6AD511B9075DF8AF97BDB95F7695C608F
Session-ID-ctx:
Master-Key: AABADC29A457D65D8E26F89B88ED6C45962D8B9A4207694E3E6A7BC78E10D9C92FD36E150359D0B3B59B5CE77F3C8F95
Key-Arg : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
TLS session ticket lifetime hint: 7200 (seconds)
TLS session ticket:
0000 - fb e1 4d e9 44 02 d4 53-4f 66 c9 9c 1f d5 51 df ..M.D..SOf....Q.
0010 - 9d 89 19 87 34 49 50 15-1d dc db 41 fa e0 d6 05 ....4IP....A....
0020 - 15 42 73 a2 6d 62 c3 0d-96 91 47 36 f0 bd 08 5a .Bs.mb....G6...Z
0030 - b8 f0 75 f7 d2 c0 d2 2b-93 ae bc 6a 1b 95 b0 e1 ..u....+...j....
0040 - 69 36 59 c2 16 f9 2a e4-2c fb c0 28 37 5d de e3 i6Y...*.,..(7]..
0050 - da a6 05 5a 9e 6c d6 5c-b8 0d f2 bb 7c e7 72 0c ...Z.l.\....|.r.
0060 - 45 9f f0 ed 0e c2 bc 6f-41 1e 94 9c 0e 65 e5 27 E......oA....e.'
0070 - 9f 3d d4 e8 d0 10 ea 0b-51 55 13 9e 80 59 be 6f .=......QU...Y.o
0080 - ec fa 37 84 d2 20 51 cb-c4 a0 47 c4 f8 bb b2 6d ..7.. Q...G....m
0090 - a7 92 d7 d3 5d bc d4 3d-72 96 35 c9 f3 08 91 73 ....]..=r.5....s

Start Time: 1515240422
Timeout : 300 (sec)
Verify return code: 0 (ok)
---
DONE


5.6 簡潔に表示する方法(-quiet)

quietオプションを使うと、証明書チェインだけが表示されます。

[root@server ~]# openssl s_client -connect www.example.com:443 -quiet

depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert High Assurance EV Root CA
verify return:1
depth=1 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert SHA2 High Assurance Server CA
verify return:1
depth=0 C = US, ST = California, L = Los Angeles, O = Internet Corporation for Assigned Names and Numbers, OU = Technology, CN = www.example.org
verify return:1


5.7 TLSメッセージを表示する方法(-msg)

msgオプションを使うと、TLSサーバとクライアントでやりとりするメッセージを表示することができます。

ただし、msgオプションだけだと、メッセージが見にくいので、grepで絞り込みをしてみました。

grepで絞り込んだ左端は、以下の意味になります。

>>> : TLSクライアント(s_client)からTLSサーバに送信されるメッセージ

<<< : TLSサーバからTLSクライアントに送信されるメッセージ

[root@server ~]# openssl s_client -connect www.example.com:443 -msg |grep -e ">>>" -e "<<<"

>>> TLS 1.2 [length 0005]
>>> TLS 1.2 Handshake [length 011c], ClientHello
<<< ??? [length 0005]
<<< TLS 1.2 Handshake [length 003d], ServerHello
<<< ??? [length 0005]
<<< TLS 1.2 Handshake [length 0ab8], Certificate
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert High Assurance EV Root CA
verify return:1
depth=1 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert SHA2 High Assurance Server CA
verify return:1
depth=0 C = US, ST = California, L = Los Angeles, O = Internet Corporation for Assigned Names and Numbers, OU = Technology, CN = www.example.org
verify return:1
<<< ??? [length 0005]
<<< TLS 1.2 Handshake [length 014d], ServerKeyExchange
<<< ??? [length 0005]
<<< TLS 1.2 Handshake [length 0004], ServerHelloDone
>>> ??? [length 0005]
>>> TLS 1.2 Handshake [length 0046], ClientKeyExchange
>>> ??? [length 0005]
>>> TLS 1.2 ChangeCipherSpec [length 0001]
>>> ??? [length 0005]
>>> TLS 1.2 Handshake [length 0010], Finished
<<< ??? [length 0005]
<<< TLS 1.2 Handshake [length 00aa]???
<<< ??? [length 0005]
<<< TLS 1.2 ChangeCipherSpec [length 0001]
<<< ??? [length 0005]
<<< TLS 1.2 Handshake [length 0010], Finished


5.8 証明書をファイルに保存する方法

サーバ(www.example.com)がクライアントに送信する証明書をファイルに保存してみます。


証明書のファイルへの保存

[root@server ~]# openssl s_client -connect www.example.com:443 -showcerts < /dev/null 2>/dev/null| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'> example.pem


[root@server ~]# cat example.pem
-----BEGIN CERTIFICATE-----
<中略>
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
<中略>
-----END CERTIFICATE-----


証明書の確認

fileコマンドで証明書のファイル形式を確認をします。PEM形式であることがわかります。

/usr/share/magicにPEMファイルの判定処理が記述されていました。
[root@server ~]# file example.pem
example.pem: PEM certificate


6 s_serverコマンドの使い方

標準コマンドの中に、s_serverコマンドがあります。

s_serverは、TLSサーバを起動するコマンドです。


6.1 manの使い方

[root@server ~]# man s_server

S_SERVER(1) OpenSSL S_SERVER(1)

NAME
s_server - SSL/TLS server program

SYNOPSIS
openssl s_server [-accept port] [-context id] [-verify depth] [-Verify depth] [-crl_check] [-crl_check_all] [-cert filename] [-certform DER|PEM]
[-key keyfile] [-keyform DER|PEM] [-pass arg] [-dcert filename] [-dcertform DER|PEM] [-dkey keyfile] [-dkeyform DER|PEM] [-dpass arg] [-dhparam
filename] [-nbio] [-nbio_test] [-crlf] [-debug] [-msg] [-state] [-CApath directory] [-CAfile filename] [-trusted_first] [-no_alt_chains]
[-nocert] [-cipher cipherlist] [-serverpref] [-krb5svc service] [-keytab filename] [-quiet] [-no_tmp_rsa] [-ssl3] [-tls1] [-tls1_1] [-tls1_2]
[-no_ssl3] [-no_tls1] [-no_dhe] [-bugs] [-hack] [-www] [-WWW] [-HTTP] [-engine id] [-tlsextdebug] [-no_ticket] [-id_prefix arg] [-rand file(s)]
[-serverinfo file] [-no_resumption_on_reneg] [-status] [-status_verbose] [-status_timeout nsec] [-status_url url] [-alpn protocols]
[-nextprotoneg protocols]


6.2 事前準備(秘密鍵、サーバ証明書の作成)

秘密鍵とサーバ証明書を作成します。


秘密鍵の作成

[root@server ~]# openssl genrsa -out private.key 2048

Generating RSA private key, 2048 bit long modulus
........+++
...............................+++
e is 65537 (0x10001)


証明書署名要求の作成

[root@server ~]# openssl req -new -key private.key -out server.csr

-中略-
Country Name (2 letter code) [XX]:jp
State or Province Name (full name) []:tokyo
Locality Name (eg, city) [Default City]:xx
Organization Name (eg, company) [Default Company Ltd]:yy
Organizational Unit Name (eg, section) []:zz
Common Name (eg, your name or your server's hostname) []:server ★サーバのホスト名を入力する。
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:


自身の秘密鍵(private.key)を使って、サーバ証明書に署名をします。

サーバ証明書は、server.crtというファイル名で作成します。


サーバ証明書の作成

[root@server ~]# openssl x509 -req -in server.csr -signkey private.key -out server.crt

Signature ok
subject=/C=jp/ST=tokyo/L=xx/O=yy/OU=zz/CN=server
Getting Private key


作成したファイルの確認

private.keyは秘密鍵、server.csrは証明書署名要求、server.crtはサーバ証明書です。

[root@server ~]# ls
private.key server.csr server.crt


6.2 基本的な使い方

オプションとしてサーバ証明書(server.crt)と秘密鍵(private.key)を指定してTLSサーバを起動します。

サーバ証明書と秘密鍵を確認する。

[root@server ~]# ls server.crt private.key
private.key server.crt

TLSサーバを起動する。オプションとして、サーバ証明書と秘密鍵を指定する。
[root@server ~]# openssl s_server -cert server.crt -key private.key
Using default temp DH parameters
ACCEPT

ポート番号を確認する。TLSサーバは4433番でListenしていることがわかる。
[root@server ~]# lsof -i:4433 -P
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
openssl 2235 root 3u IPv6 40944 0t0 TCP *:4433 (LISTEN)

clientからserverの4433ポートで動作しているTLSサーバに接続する。
[root@client ~]# openssl s_client -connect server:4433


6.3 指定したポート番号でListenする方法(-accept)

443番ポートを指定してTLSサーバを起動する。

[root@server ~]# openssl s_server -accept 443 -cert server.crt -key private.key
Using default temp DH parameters
ACCEPT

ポート番号を確認する。TLSサーバが443番ポートでListenしていることがわかる。
[root@server ~]# lsof -i:443 -P
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
openssl 2308 root 3u IPv6 43614 0t0 TCP *:443 (LISTEN)


6.4 WWWサーバとして動作させる方法(-WWW)


事前準備

テスト用のhtmlファイルを作成する。

[root@server ~]# vi index.html
[root@server ~]# cat index.html
Hello World

サーバ証明書と秘密鍵を確認する。
[root@server ~]# ls server.crt private.key
private.key server.crt

443番ポートへのアクセスを許可する。
[root@server ~]# firewall-cmd --add-port=443/tcp
success



TLSサーバの起動

WWWオプションを指定して、WEBサーバとして起動する。

[root@server ~]# openssl s_server -accept 443 -cert server.crt -key private.key -WWW
Using default temp DH parameters
ACCEPT


TLSクライアントの起動

curlコマンドでWEBサーバにアクセスする。

[root@client ~]# curl -k https://server:443/index.html
Hello World


7 X509コマンドの使い方

標準コマンドの中に、X509コマンドがあります。

X.509は、公開鍵証明書を操作するコマンドです。


7.1 manの使い方

[root@server ~]# man x509

X509(1) OpenSSL X509(1)

NAME
x509 - Certificate display and signing utility

SYNOPSIS
openssl x509 [-inform DER|PEM|NET] [-outform DER|PEM|NET] [-keyform DER|PEM] [-CAform DER|PEM] [-CAkeyform DER|PEM] [-in filename] [-out
filename] [-serial] [-hash] [-subject_hash] [-issuer_hash] [-ocspid] [-subject] [-issuer] [-nameopt option] [-email] [-ocsp_uri] [-startdate]
[-enddate] [-purpose] [-dates] [-checkend num] [-modulus] [-pubkey] [-fingerprint] [-alias] [-noout] [-trustout] [-clrtrust] [-clrreject]
[-addtrust arg] [-addreject arg] [-setalias arg] [-days arg] [-set_serial n] [-signkey filename] [-passin arg] [-x509toreq] [-req] [-CA filename]
[-CAkey filename] [-CAcreateserial] [-CAserial filename] [-force_pubkey key] [-text] [-certopt option] [-C] [-md2|-md5|-sha1|-mdc2] [-clrext]
[-extfile filename] [-extensions section] [-engine id]


7.2 サーバ証明書の各種情報を表示する方法

事前準備として、www.example.comからサーバ証明書をダウンロードします。


事前準備

[root@server ~]# openssl s_client -connect www.example.com:443 -showcerts < /dev/null 2>/dev/null| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'> example.pem


ダウンロードしたサーバ証明書を確認する。
[root@server ~]# file example.pem
example.pem: PEM certificate

www.example.orgのサーバ証明書を確認してみます。


サーバ証明書の確認方法(-text)

[root@server ~]# openssl x509 -in example.pem -noout -text

Certificate:
Data:
Version: 3 (0x2)
Serial Number:
0e:64:c5:fb:c2:36:ad:e1:4b:17:2a:eb:41:c7:8c:b0
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert SHA2 High Assurance Server CA
Validity
Not Before: Nov 3 00:00:00 2015 GMT
Not After : Nov 28 12:00:00 2018 GMT
Subject: C=US, ST=California, L=Los Angeles, O=Internet Corporation for Assigned Names and Numbers, OU=Technology, CN=www.example.org
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:b3:40:96:2f:61:63:3e:25:c1:97:ad:65:45:fb:
ef:13:42:b3:2c:99:86:f4:b5:80:0b:76:dc:06:38:
2c:1f:a3:62:55:5a:36:76:de:ae:5d:fc:e2:e5:b4:
e6:ec:5d:ca:ee:ca:df:50:16:24:2c:ee:fc:9a:b6:
8c:f6:a8:b3:ac:7a:08:7b:2a:1f:ad:5f:e7:fa:96:
59:25:ab:90:b0:f8:c2:3f:13:04:26:74:68:0f:c6:
78:2a:95:8a:5f:42:f2:0e:ed:52:a6:eb:68:23:89:
e5:43:f8:6d:12:1b:62:42:7b:a8:05:f3:59:c4:5e:
d6:c5:cc:46:c0:4b:19:b9:2d:4a:71:72:24:1e:5e:
55:44:93:ab:78:a1:47:4d:a5:dc:07:5a:9c:67:f4:
11:68:12:2f:d3:28:71:bc:ad:72:05:3c:16:75:d4:
f8:72:58:ba:19:f1:dc:09:ed:f1:18:c6:92:2f:7d:
bc:16:0b:37:8d:8a:ef:1b:6f:4f:b9:e0:7a:54:98:
bf:b5:b6:cf:bb:aa:93:7f:0a:7f:1f:56:eb:a9:d8:
e1:db:d5:39:d8:18:5b:d1:f2:64:33:d0:d6:c4:23:
ff:09:ab:6d:71:ce:da:cf:c1:17:9c:23:be:2c:af:
2f:92:1c:3f:90:08:89:58:f2:b1:e1:10:6f:83:2e:
f7:9f
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Authority Key Identifier:
keyid:51:68:FF:90:AF:02:07:75:3C:CC:D9:65:64:62:A2:12:B8:59:72:3B

X509v3 Subject Key Identifier:
A6:4F:60:1E:1F:2D:D1:E7:F1:23:A0:2A:95:16:E4:E8:9A:EA:6E:48
X509v3 Subject Alternative Name:
DNS:www.example.org, DNS:example.com, DNS:example.edu, DNS:example.net, DNS:example.org, DNS:www.example.com, DNS:www.example.edu, DNS:www.example.net
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
X509v3 Extended Key Usage:
TLS Web Server Authentication, TLS Web Client Authentication
X509v3 CRL Distribution Points:

Full Name:
URI:http://crl3.digicert.com/sha2-ha-server-g4.crl

Full Name:
URI:http://crl4.digicert.com/sha2-ha-server-g4.crl

X509v3 Certificate Policies:
Policy: 2.16.840.1.114412.1.1
CPS: https://www.digicert.com/CPS
Policy: 2.23.140.1.2.2

Authority Information Access:
OCSP - URI:http://ocsp.digicert.com
CA Issuers - URI:http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt

X509v3 Basic Constraints: critical
CA:FALSE
Signature Algorithm: sha256WithRSAEncryption
84:a8:9a:11:a7:d8:bd:0b:26:7e:52:24:7b:b2:55:9d:ea:30:
89:51:08:87:6f:a9:ed:10:ea:5b:3e:0b:c7:2d:47:04:4e:dd:
45:37:c7:ca:bc:38:7f:b6:6a:1c:65:42:6a:73:74:2e:5a:97:
85:d0:cc:92:e2:2e:38:89:d9:0d:69:fa:1b:9b:f0:c1:62:32:
65:4f:3d:98:db:da:d6:66:da:2a:56:56:e3:11:33:ec:e0:a5:
15:4c:ea:75:49:f4:5d:ef:15:f5:12:1c:e6:f8:fc:9b:04:21:
4b:cf:63:e7:7c:fc:aa:dc:fa:43:d0:c0:bb:f2:89:ea:91:6d:
cb:85:8e:6a:9f:c8:f9:94:bf:55:3d:42:82:38:4d:08:a4:a7:
0e:d3:65:4d:33:61:90:0d:3f:80:bf:82:3e:11:cb:8f:3f:ce:
79:94:69:1b:f2:da:4b:c8:97:b8:11:43:6d:6a:25:32:b9:b2:
ea:22:62:86:0d:a3:72:7d:4f:ea:57:3c:65:3b:2f:27:73:fc:
7c:16:fb:0d:03:a4:0a:ed:01:ab:a4:23:c6:8d:5f:8a:21:15:
42:92:c0:34:a2:20:85:88:58:98:89:19:b1:1e:20:ed:13:20:
5c:04:55:64:ce:9d:b3:65:fd:f6:8f:5e:99:39:21:15:e2:71:
aa:6a:88:82


サーバ証明書に登録されている、

国名(C)、組織名(O)、コモン名(CN)等のサブジェクトを確認してみます。


サブジェクトの確認方法(-subject)

root@server ~]# openssl x509 -in example.pem -noout -subject

subject= /C=US/ST=California/L=Los Angeles/O=Internet Corporation for Assigned Names and Numbers/OU=Technology/CN=www.example.org

サーバ証明書にはシリアル番号が格納されています。

ここでは、サーバ証明書に格納されているシリアル番号を表示してみます。


シリアル番号の確認方法(-serial)

[root@server ~]# openssl x509 -in example.pem -noout -serial

serial=0E64C5FBC236ADE14B172AEB41C78CB0

www.example.orgのサーバ証明書を発行した中間CAの情報を確認してみます。

DigiCertという中間CAがサーバ証明書の発行元であることがわかります。


サーバ証明書の発行者を表示する方法(-issuer)

[root@server ~]# openssl x509 -in example.pem -noout -issuer

issuer= /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 High Assurance Server CA

OCSP(Online Certificate Status Protocol)は、

X.509公開鍵証明書の失効状態を取得するための通信プロトコルです。


ocspの確認方法(-ocsp_uri)

[root@server ~]# openssl x509 -in example.pem -noout -ocsp_uri

http://ocsp.digicert.com

証明書から公開鍵を取り出してみます。


証明書から公開鍵を取り出す方法(-pubkey)

[root@server ~]# openssl x509 -in example.pem -noout -pubkey

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs0CWL2FjPiXBl61lRfvv
E0KzLJmG9LWAC3bcBjgsH6NiVVo2dt6uXfzi5bTm7F3K7srfUBYkLO78mraM9qiz
rHoIeyofrV/n+pZZJauQsPjCPxMEJnRoD8Z4KpWKX0LyDu1SputoI4nlQ/htEhti
QnuoBfNZxF7WxcxGwEsZuS1KcXIkHl5VRJOreKFHTaXcB1qcZ/QRaBIv0yhxvK1y
BTwWddT4cli6GfHcCe3xGMaSL328Fgs3jYrvG29PueB6VJi/tbbPu6qTfwp/H1br
qdjh29U52Bhb0fJkM9DWxCP/Cattcc7az8EXnCO+LK8vkhw/kAiJWPKx4RBvgy73
nwIDAQAB
-----END PUBLIC KEY-----


7.3 PEM形式のサーバ証明書を作成する方法(-outform PEM)

秘密鍵を作成する。

[root@server ~]# openssl genrsa -out private.key 2048

証明書署名要求を作成する。
[root@server ~]# openssl req -new -key private.key -out server.csr

PEM形式でサーバ証明書(server.crt)を作成する。
outオプションで生成するファイル名を指定します。PEM形式であることがわかるように、拡張子をpemにしました。
[root@server ~]# openssl x509 -req -in server.csr -signkey private.key -out server.pem -outform PEM

生成したファイルを確認する。
[root@server ~]# ls server.pem
server.pem

生成したファイルはPEM certificateであることがわかる。
[root@server ~]# file server.pem
server.pem: PEM certificate

なお、デフォルトでPEM形式のサーバ証明書を生成するので、以下のようにoutformオプションは省略することができます。
[root@server ~]# openssl x509 -req -in server.csr -signkey private.key -out server.crt


7.4 DER形式のサーバ証明書を作成する方法(-outform DER)

DER形式でサーバ証明書(server.der)を生成する。

outオプションで生成するファイル名を指定します。DER形式であることがわかるように、拡張子をderにしました。
[root@server ~]# openssl x509 -req -in server.csr -signkey private.key -out server.der -outform DER

生成したファイルを確認する。
[root@server ~]# ls server.der
server.der

生成したファイルはバイナリデータであることがわかる。
[root@server ~]# file server.der
server.der: data


7.5 DER形式からPEM形式に変換する方法(-inform,-outform)

変換前のDER形式のファイルを確認する。

[root@server ~]# ls server.der
server.der

サーバ証明書をDER形式からPEM形式に変換する。
[root@server ~]# openssl x509 -in server.der -inform DER -out server.pem -outform PEM

変換後のPEM形式のファイルを確認する。
[root@server ~]# ls server.pem
server.pem


8 ciphersコマンドの使い方


8.1 manの使い方

[root@server ~]# man ciphers

CIPHERS(1) OpenSSL CIPHERS(1)

NAME
ciphers - SSL cipher display and cipher list tool.

SYNOPSIS
openssl ciphers [-v] [-V] [-ssl3] [-tls1] [cipherlist]


8.2 暗号スイートの確認方法

[root@client ~]# openssl ciphers -v

ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(256) Mac=AEAD
ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA384
-以下、略-


9 dgstコマンドの使い方

dgstコマンドは、メッセージダイジェストを計算するときに使います。


9.1 manの使い方

[root@server ~]# man dgst

DGST(1) OpenSSL DGST(1)

NAME
dgst, sha, sha1, mdc2, ripemd160, sha224, sha256, sha384, sha512, md2, md4, md5, dss1 - message digests

SYNOPSIS
openssl dgst [-sha|-sha1|-mdc2|-ripemd160|-sha224|-sha256|-sha384|-sha512|-md2|-md4|-md5|-dss1] [-c] [-d] [-hex] [-binary] [-r] [-non-fips-allow]
[-out filename] [-sign filename] [-keyform arg] [-passin arg] [-verify filename] [-prverify filename] [-signature filename] [-hmac key]
[-non-fips-allow] [-fips-fingerprint] [file...]

openssl [digest] [...]


9.2 ダイジェストを計算する方法

テスト用のファイルを作成する。

[root@client ~]# fallocate -l 1K 1K.txt
[root@client ~]# ls -l 1K.txt
-rw-r--r-- 1 root root 1024 1月 6 22:22 1K.txt

sha512でダイジェストを計算する。
[root@client ~]# openssl dgst -sha512 1K.txt
SHA512(1K.txt)= 8efb4f73c5655351c444eb109230c556d39e2c7624e9c11abc9e3fb4b9b9254218cc5085b454a9698d085cfa92198491f07a723be4574adc70617b73eb0b6461

dss1でダイジェストを計算する。
[root@client ~]# openssl dgst -dss1 1K.txt
DSA(1K.txt)= 60cacbf3d72e1e7834203da608037b1bf83b40e8


10 その他


10.1 暗号通信の確認方法

s_serverとs_clientを使って、TLSサーバ、クライアントを起動します。

サーバ、クライアントが起動したら、クライアント側で文字列を入力すると、

暗号化されたデータがサーバに送信されます。

暗号化されたデータはWiresharkで確認することができます。

サーバ証明書と秘密鍵を確認する。

[root@server ~]# ls server.crt private.key
private.key server.crt

TLSサーバを起動する。表示を見やすくするため、quietオプションを指定しました。
[root@server ~]# openssl s_server -accept 443 -cert server.crt -key private.key -quiet

443番ポートへのアクセスを許可する。
[root@server ~]# firewall-cmd --add-port=443/tcp
success

TLSクライアントを起動する。文字列"12345"を入力する。
[root@client ~]# openssl s_client -connect server:443 -quiet
depth=0 C = jp, ST = tokyo, L = xx, O = yy, OU = zz, CN = server
verify error:num=18:self signed certificate
verify return:1
depth=0 C = jp, ST = tokyo, L = xx, O = yy, OU = zz, CN = server
verify return:1
12345

TLSサーバ側で"12345"が表示されたことがわかる。
[root@server ~]# openssl s_server -accept 443 -cert server.crt -key private.key -quiet
12345


10.2 秘密鍵、証明書署名要求、サーバ証明書が一致しているかどうかの確認方法

正しい組み合わせの場合、秘密鍵、証明書署名要求、サーバ証明書の3ファイルには同一のModulusデータが含まれます。

秘密鍵のチェックサムを確認する

[root@server ~]# openssl rsa -noout -modulus -in private.key |openssl md5
(stdin)= 8675c59d92b0a9454dc3478c836e1c2a

証明書署名要求のチェックサムを確認する
[root@server ~]# openssl req -noout -modulus -in server.csr |openssl md5
(stdin)= 8675c59d92b0a9454dc3478c836e1c2a

サーバ証明書のチェックサムを確認する
[root@server ~]# openssl x509 -noout -modulus -in server.crt |openssl md5
(stdin)= 8675c59d92b0a9454dc3478c836e1c2a

上記全てのチェックサムが一致するので、秘密鍵、証明書署名要求、サーバ証明書は正しい組み合わせであることがわかる。


11 ブラウザでの確認方法


11.1 ルートCAまでの証明書チェインを確認する方法

下記サイトのルートCAまでの証明書チェインを確認してみます。

https://www.example.com/

tls1.png

「証明書」をクリックします。

tls2.png

ルートCAへの証明書チェインは、以下のようになっていました。

tls3.png

ブラウザに表示されたルートCAまでの証明書チェインは以下のとおりです。

ルートCAのCN(Common Name)は、"DigiCert High Assurance EV Root CA"となっていました。


ルートCAまでの証明書チェイン

「CN = DigiCert High Assurance EV Root CA」

+「CN = DigiCert SHA2 High Assurance Server CA」
+ 「CN = www.example.org」


11.2 ルートCA証明書を確認する方法

次に、ブラウザにインストールされているルートCAの証明書を確認してみます。

ここでは、"DigiCert High Assurance EV Root CA"のルートCAの証明書が

インストールされていることを確認してみます。

tls4.png

tls5.png

tls6.png


Z 参考情報

Checking A Remote Certificate Chain With OpenSSL

OpenSSLコマンドで証明書のチェック

OpenSSLをSSL/TLSクライアントとして使ってみる

PKIとは

openssl s_client

opensslコマンドで証明書情報を確認したい

秘密鍵、公開鍵、証明書、CSR生成のOpenSSLコマンドまとめ

02 OpenSSLで遊ぼう!

OpenSSLのコマンドラインプログラムの使い方

OpenSSL Command-Line HOWTO

Create a simple HTTPS server with OPENSSL S_SERVER

証明書や秘密鍵のフォーマットを変換することだけを書いた

SSL証明書ファイルのエンコードタイプとopensslでの変換方法

証明書とドメインキーの PEM 形式の必要条件

理解してるつもりの SSL/TLS でも、もっと理解したら面白かった話

UNIX/Linuxの部屋 opensslコマンドの使い方

【OpenSSL】ルートCA、中間CAの構築

やむを得ない場合の自己証明書と自己認証局によるSSLサイト構築

多段の中間CA証明書作成 -証明書作成編

Create your own CA or root CA, subordinate CA

OpenSSL: Manually verify a certificate against an OCSP