Help us understand the problem. What is going on with this article?

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 genrsa
GENRSA(1)                                                                OpenSSL                                                                GENRSA(1)

NAME
       genrsa - generate an RSA private key

SYNOPSIS
       openssl genrsa [-out filename] [-passout arg] [-aes128] [-aes192] [-aes256] [-camellia128] [-camellia192] [-camellia256] [-des] [-des3] [-idea]
       [-f4] [-3] [-rand file(s)] [-engine id] [numbits]

4.2 RSA秘密鍵の生成方法

2048ビットのRSA秘密鍵を生成します

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

fileコマンドを使って、作成した秘密鍵を確認します。

秘密鍵の確認
[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 -pubout -out public.key
writing RSA key

公開鍵(public.key)が作成できたことがわかります。

公開鍵の確認
[root@server ~]# ls
private.key  public.key

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

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

RSA秘密鍵をファイルにそのまま保存しておくのは良くありません。
もし秘密鍵が盗まれると、暗号通信が全て解読できてしまうからです。
そこで 秘密鍵にパスフレーズを設定して、秘密鍵を利用できないようにしておきます。
ここでは、秘密鍵を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は使用禁止なので、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形式であることがわかります。

証明書の確認
[root@server ~]# file example.pem
example.pem: PEM certificate

なお、/usr/share/magicにPEMファイルの判定処理が記述されていました。

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

作成したファイルを確認します。

作成したファイルの確認
[root@server ~]# ls
private.key server.csr server.crt

上記ファイルは、それぞれ、以下のとおりです。
・private.key:秘密鍵
・server.csr:証明書署名要求
・server.crt:サーバ証明書

6.2 基本的な使い方

サーバ証明書(server.crt)と秘密鍵(private.key)を指定してTLSサーバを起動します。
6.1で作成したサーバ証明書と秘密鍵を確認します。

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

TLSサーバを起動します。
サーバ証明書と秘密鍵を指定してTLSサーバを起動します。

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)

クライアントからTLSサーバに接続します。
接続先ポート番号は4433ポートです。

TLSサーバへの接続
[root@client ~]# openssl s_client -connect server:4433

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

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

console
[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

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

TLSサーバの起動
[root@server ~]# openssl s_server -accept 443 -cert server.crt -key private.key -WWW
Using default temp DH parameters
ACCEPT

curlコマンドでWEBサーバにアクセスしてみます。

TLSクライアントの起動
[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 rsautlコマンドの使いかた

標準コマンドの中に、rsautlコマンドがあります。
rsautlコマンドを使って、公開鍵で暗号化したファイルを秘密鍵で復号してみます。

10.1 manの使い方

manの抜粋
[root@server ~]# man rsautl
RSAUTL(1)                                                        OpenSSL                                                       RSAUTL(1)

NAME
       rsautl - RSA utility

SYNOPSIS
       openssl rsautl [-in file] [-out file] [-inkey file] [-pubin] [-certin] [-sign] [-verify] [-encrypt] [-decrypt] [-pkcs] [-ssl]
       [-raw] [-hexdump] [-asn1parse]

DESCRIPTION
       The rsautl command can be used to sign, verify, encrypt and decrypt data using the RSA algorithm.
-snip-

10.2 事前準備

テスト用ファイル作成
[root@server ~]# echo "1234567890" > test.txt
[root@server ~]# cat test.txt
1234567890

2048ビットのRSA秘密鍵を作成します。ここでは、作成した秘密鍵の暗号化はしません。

RSA秘密鍵の作成
[root@server ~]# openssl genrsa -out priv.key 2048
Generating RSA private key, 2048 bit long modulus
.........+++
...............+++
e is 65537 (0x10001)

作成した秘密鍵(priv.key)を確認します。

作成した秘密鍵の確認
[root@server ~]# ls
priv.key  test.txt

作成したRSA秘密鍵に対する公開鍵を作成します。

RSA公開鍵の作成
[root@server ~]# openssl rsa -in priv.key -pubout -out pub.key
writing RSA key

作成した公開鍵(pub.key)を確認します。

作成した公開鍵の確認
[root@server ~]# ls
priv.key  pub.key  test.txt

10.3 暗号化および復号

作成した公開鍵を使って、テスト用ファイルを暗号化してみます。
暗号化したファイルのファイル名は、test.txt.encになります。

テスト用ファイルの暗号化
[root@server ~]# openssl rsautl -encrypt -pubin -inkey pub.key -in test.txt -out test.txt.enc

暗号化したファイルを確認します。
test.txt.encというファイルが作成できたことがわかります。

暗号化したファイルの確認
[root@server ~]# ls
priv.key  pub.key  test.txt  test.txt.enc

テスト用のファイルを削除します。

テスト用ファイルの削除
[root@server ~]# rm test.txt
rm: 通常ファイル `test.txt' を削除しますか? y

ファイルを確認します。テスト用ファイルが削除されたことがわかります。

ファイルの確認
[root@server ~]# ls
priv.key  pub.key  test.txt.enc

暗号化したファイルを復号します。復号するファイルのファイル名はtest.txtにします。

暗号化したファイルの復号
[root@server ~]# openssl rsautl -decrypt -inkey priv.key -in test.txt.enc -out test.txt

復号したファイルの内容を確認してみます。正しく復号できていることがわかります。

ファイル内容の確認
[root@server ~]# cat test.txt
1234567890

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

12 opensslコマンドで証明書を確認する方法

たとえば、下記URLにアクセスした際に得られる証明書の確認方法について説明します。
https://www.kantei.go.jp/

上記URLにブラウザでアクセスします。そのときのルート証明書までのパスを確認します。
サーバ証明書は、中間CAのGlobalSign RSA OV SSL CA 2018が発行しています。
そして、中間CAの証明書は、ルートCAのGlobalSignが発行してることがわかります。
キャプチャ.PNG

次に、5.5の方法を使って、証明書を表示してみます。

証明書の確認方法
[root@server ~]# openssl s_client -connect www.kantei.go.jp:443 -showcerts < /dev/null

上記コマンドを実行して得られる結果を以下に示します。
説明に必要な部分だけを引用しています。
0ではじまるところが、サーバ証明書、1ではじまるところが中間CA証明書です。
そして、i(issuer)は証明書の発行者、s(subject)は証明書の発行を受ける側を表します。
つまり、首相官邸ホームページにアクセスすると、webサーバがクライアントに
サーバ証明書(下記0の証明書)、中間CA証明書(下記1の証明書)を送付していることがわかります。

webサーバがクライアントに送付する証明書一覧
[root@server ~]# openssl s_client -connect www.kantei.go.jp:443 -showcerts < /dev/null

---
Certificate chain
 0 s:/C=JP/ST=Tokyo/L=Chiyoda-ku/OU=Cabinet Public Relations Office/O=Cabinet Secretariat/CN=*.kantei.go.jp
   i:/C=BE/O=GlobalSign nv-sa/CN=GlobalSign RSA OV SSL CA 2018
-----BEGIN CERTIFICATE-----
MIIGwDCCBaigAwIBAgIMeK3KQoU/Q7cHQSn3MA0GCSqGSIb3DQEBCwUAMFAxCzAJ

-中略-

dB3vtg==
-----END CERTIFICATE-----
 1 s:/C=BE/O=GlobalSign nv-sa/CN=GlobalSign RSA OV SSL CA 2018
   i:/OU=GlobalSign Root CA - R3/O=GlobalSign/CN=GlobalSign
-----BEGIN CERTIFICATE-----
MIIETjCCAzagAwIBAgINAe5fIh38YjvUMzqFVzANBgkqhkiG9w0BAQsFADBMMSAw

-中略-

SPY=
-----END CERTIFICATE-----

13 その他

13.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

13.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

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

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
SSL TLSセッションチケット

hana_shin
写真は淡路島SAから明石海峡大橋を撮影したものです('19夏撮影)。'20年夏も3年連続で四国、大阪に行く予定でしたが、コロナ終息しないので断念。甲子園で高校野球もみれない。ほんと悲しい!コロナなんとかならないか!治療薬の研究開発している人がんばってほしいな。ソフトが少しでも役に立てればと思う今日この頃。取得済資格:ネットワークスペシャリスト、オンライン情報処理技術者。
https://hana-shin.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away