hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

opensslコマンドの使い方

1 opensslコマンドとは?

opensslコマンドは、以下のような様々な暗号化機能を実行できます。manより抜粋したものを以下に示します。

  • 公開鍵暗号化操作
  • X.509証明書、CSR、およびCRLの作成
  • メッセージダイジェストの計算
  • 暗号による暗号化と復号化
  • TLSクライアントおよびサーバーテスト
  • S/MIME署名または暗号化されたメールの処理
  • タイムスタンプのリクエスト、生成、検証

2 検証環境

2.1 ネットワーク構成

サーバとクライアントの2台構成です。図中のens33はNICの名前です。

                               192.168.2.0/24
client(ens33) ------------------------------------------(ens33) server
        .105                                           .100

2.2 版数

CentOS版数は、サーバ、クライアントともに下記版数です。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

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

3 opensslパッケージのインストール方法

サーバ、クライアントにopensslパッケージをインストールします。

[root@server ~]# yum -y install openssl

opensslコマンドの版数を確認します。

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

4 opensslのコマンド表示方法

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

openssl command [ command_opts ] [ command_args ]

上記書式のcommandの部分ですが、多数のコマンドが存在します。ここでは、どのようなコマンドが存在するのかを確認する方法について説明します。コマンドの分類として、大きく以下のものがあります。
・標準コマンド(list-standard-commands)
・メッセージダイジェストのコマンド(list-message-digest-commands)
・暗号スイートのコマンド(list-cipher-commands)
・暗号スイートのアルゴリズムに関するコマンド(list-cipher-algorithms)
・メッセージダイジェストのアルゴリズムに関するコマンド(list-message-digest-algorithms)
・公開鍵のアルゴリズムに関するコマンド(list-public-key-algorithms)

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

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

[root@server ~]# openssl list-standard-commands
asn1parse
ca
ciphers
-snip-

"man asn1parse"と実行すると、asn1parseのマニュアルを表示することができます。

[root@server ~]# man asn1parse

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

メッセージダイジェストを生成するコマンドを表示してみます。md2,md4,md5等のコマンドがあることがわかります。

[root@server ~]# openssl list-message-digest-commands
md2
md4
md5
-snip-

"man md2"と実行すると、md2のマニュアルを表示することができます。

[root@server ~]# man md2

4.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
-snip-

4.4 暗号スイート一覧を表示する方法(list-cipher-algorithms)

暗号スイート一覧を表示してみます。
TLS1.2 までの暗号スイートは、"鍵交換ー署名ー暗号化ーハッシュ関数"の組によって構成されます。TLS1.3 の暗号スイートは、"暗号化ーハッシュ関数"の組み合わせになりました。
https://www.ipa.go.jp/security/ipg/documents/ipa-cryptrec-gl-3001-3.0.1.pdf

[root@server ~]# openssl list-cipher-algorithms
AES-128-CBC
AES-128-CBC-HMAC-SHA1
AES-128-CBC-HMAC-SHA256
-snip-

4.5 メッセージダイジェストのアルゴリズム一覧する方法(list-message-digest-algorithms)

メッセージダイジェストのアルゴリズム一覧を表示してみます。

[root@server ~]# openssl list-message-digest-algorithms
DSA
DSA-SHA
DSA-SHA1 => DSA
-snip-

5 genrsaコマンドの使い方

genrsaは、RSA秘密鍵を生成するコマンドです。"man genrsa"と実行すると、genrsaのマニュアルを参照することができます。

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]

DESCRIPTION
       The genrsa command generates an RSA private key.
-snip-

ここでは、genrsaコマンドで秘密鍵を作成し、秘密鍵に対する公開鍵を作成してみます。また、作成した秘密鍵パスフレーズを設定してみます。まず、2048ビットのRSA秘密鍵(private.key)を生成します

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

作成した秘密鍵(private.key)を確認します。fileコマンドで確認すると、private.keyが秘密鍵であることがわかります。

[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月 26 17:19 private.key

生成した秘密鍵の中身を確認してみます。BEGINとENDの間が秘密鍵になります。

[root@server ~]# cat private.key
-----BEGIN RSA PRIVATE KEY-----
-snip-
-----END RSA PRIVATE KEY-----

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

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

公開鍵(public.key)のファイルタイプを確認してみます。

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

最後に、秘密鍵パスフレーズを設定します。
秘密鍵をそのまま保存しておくのは良くありません。もし秘密鍵が盗まれると、暗号通信が全て解読できてしまうからです。そこで 秘密鍵パスフレーズを設定して、秘密鍵を盗まれても利用できないようにしておきます。ここでは、des3で秘密鍵を暗号化してみます。des3の他にdes,idea等があります。

[root@server ~]# openssl genrsa -out private.key -des3 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: ★もう一度パスフレーズの設定

6 s_clientコマンドの使い方

s_clientコマンドは、TLSクライアントとして動作します。

[root@server ~]# man s_client
S_CLIENT(1)                                            OpenSSL                                            S_CLIENT(1)

NAME
       s_client - SSL/TLS client program
-snip-

6.1 基本的な使い方

connectオプションを使って、www.example.comTLSで接続してみます。なお、example.comはIANAが予約しているドメインです。

[root@server ~]# openssl s_client -connect www.example.com:443
CONNECTED(00000003)
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
verify return:1
depth=1 C = US, O = DigiCert Inc, CN = DigiCert TLS RSA SHA256 2020 CA1
verify return:1
depth=0 C = US, ST = California, L = Los Angeles, O = "Verizon Digital Media Services, Inc.", CN = www.example.org
verify return:1
---
Certificate chain
 0 s:/C=US/ST=California/L=Los Angeles/O=Verizon Digital Media Services, Inc./CN=www.example.org
   i:/C=US/O=DigiCert Inc/CN=DigiCert TLS RSA SHA256 2020 CA1
 1 s:/C=US/O=DigiCert Inc/CN=DigiCert TLS RSA SHA256 2020 CA1
   i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root CA
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIHNjCCBh6gAwIBAgIQAlIW4cSZjiYyql0dqYW0PDANBgkqhkiG9w0BAQsFADBP
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMSkwJwYDVQQDEyBE
aWdpQ2VydCBUTFMgUlNBIFNIQTI1NiAyMDIwIENBMTAeFw0yMTEyMTAwMDAwMDBa
Fw0yMjEyMDkyMzU5NTlaMIGBMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZv
cm5pYTEUMBIGA1UEBxMLTG9zIEFuZ2VsZXMxLTArBgNVBAoTJFZlcml6b24gRGln
aXRhbCBNZWRpYSBTZXJ2aWNlcywgSW5jLjEYMBYGA1UEAxMPd3d3LmV4YW1wbGUu
b3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoDBCVtcLoRG58wvs
zPJMsG8TAmvPB/OF8EKPxVSYgW56kzi2+kZCs1zmyTtZk2EkQyD1eonJd63/h8gI
24b13GF1ll/c8AjKOrleD/o3fGVqyggnHp3YCj+eENtFJZoDcrr1J9mw6zbUkzmM
EWxfMxRY5cCIxR96IRTM0qdfHHMf2QMgbnoI7xdO474owE/gcWMhBHePj0sr6Aui
vpd+UG+4Ozdjf6QMmf+WosN/ynwhuv2Q0T8FpDRw1oSOpQDcKXz9lstDrjmPLcat
2MIdm+RfnFGci/5tSWJbx80eGJbOxioHt3GAYHKsVxIAkEMPI76pcHHW5XuFo00F
iCHHIwIDAQABo4ID2TCCA9UwHwYDVR0jBBgwFoAUt2ui6qiqhIx56rTaD5iyxZV2
ufQwHQYDVR0OBBYEFG3g+qTIbys3Dg1NyBKa0QeBaGBEMIGBBgNVHREEejB4gg93
d3cuZXhhbXBsZS5vcmeCC2V4YW1wbGUubmV0ggtleGFtcGxlLmVkdYILZXhhbXBs
ZS5jb22CC2V4YW1wbGUub3Jngg93d3cuZXhhbXBsZS5jb22CD3d3dy5leGFtcGxl
LmVkdYIPd3d3LmV4YW1wbGUubmV0MA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAU
BggrBgEFBQcDAQYIKwYBBQUHAwIwgY8GA1UdHwSBhzCBhDBAoD6gPIY6aHR0cDov
L2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VExTUlNBU0hBMjU2MjAyMENBMS00
LmNybDBAoD6gPIY6aHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VExT
UlNBU0hBMjU2MjAyMENBMS00LmNybDA+BgNVHSAENzA1MDMGBmeBDAECAjApMCcG
CCsGAQUFBwIBFhtodHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwfwYIKwYBBQUH
AQEEczBxMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wSQYI
KwYBBQUHMAKGPWh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRM
U1JTQVNIQTI1NjIwMjBDQTEtMS5jcnQwDAYDVR0TAQH/BAIwADCCAX0GCisGAQQB
1nkCBAIEggFtBIIBaQFnAHYARqVV63X6kSAwtaKJafTzfREsQXS+/Um4havy/HD+
bUcAAAF9osbrcAAABAMARzBFAiEA5RwolQhRMWvTnyCNwRK/v/mG2S9Df0gRhXWK
pJuhG+YCIENHIK5yyKs3fLL9nlO9ckl5b9xbo8K3FP+N+keoBB+ZAHUAQcjKsd8i
RkoQxqE6CUKHXk4xixsD6+tLx2jwkGKWBvYAAAF9osbrPAAABAMARjBEAiB7M05v
Xh19tt1EbNsZEqb7/PrJRfeMOLz1O1UTOKCH1gIgf4nU/wBGtMERQuxeebdmf3wz
+5Q0pOgf2rEi4a016SUAdgDfpV6raIJPH2yt7rhfTj5a6s2iEqRqXo47EsAgRFwq
cwAAAX2ixut2AAAEAwBHMEUCIQDQjMsK3kzqSnGNY9Y5k0bLwo2/YN/2F0oaqXXi
NdOjJAIgFw06n1b8M6QdD98zAsRR4e52c0O7YzvrJXfRSE3JnfowDQYJKoZIhvcN
AQELBQADggEBAKVUNGn++wNr8agdWjZ5WY9cYqJjmQTQY3g5VkQMNaJiXIivehDU
TcFPqtfimTlVlVrfLGxYRAOZrzkGoQjUf99IKJW4ZUOQ0WDsKoaowU1qfzpGTwbr
jzmed2HbLlTP8NjQpYPMEIIiRQUC1iUK+0lf0UOq5mLJ3Cq3yL9UbOyhYTX9ha05
c5/nZHvhwCNvyie5RT6jWLcMH69hPS2DGiVr8HG4iV1W1F3/X+HeBOsEo1YyYlII
SCHB72Cijki2QiAHzPqy71H9MDt9jH2jbYKVRIDRJ20eF2Y1+rk7qQjwLoBM44Af
W9N7n6eEuv2HEWnaVBymoUjHaSEzYydzVOg=
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Los Angeles/O=Verizon Digital Media Services, Inc./CN=www.example.org
issuer=/C=US/O=DigiCert Inc/CN=DigiCert TLS RSA SHA256 2020 CA1
---
No client certificate CA names sent
Peer signing digest: SHA256
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 3725 bytes and written 415 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
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256
    Session-ID: D314F6276859BD4117F58A13B30FCB246E1D722F8277D80A3F6C80F56CA246BE
    Session-ID-ctx:
    Master-Key: 427BB7AD3C5C32CA34CE34D200DCDDC6165FB4F73D8228FEC0850693B5958C756CAE4537AE717D22447FA4509AABB869
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    TLS session ticket lifetime hint: 7200 (seconds)
    TLS session ticket:
    0000 - d2 71 59 b7 50 27 0c d4-bc 50 76 3b 95 33 c5 b0   .qY.P'...Pv;.3..
    0010 - 6d 62 24 aa 86 65 56 84-0a 57 c6 29 88 c5 de b9   mb$..eV..W.)....
    0020 - 1b 4b 66 02 49 b0 30 fa-a6 0a 1f 37 e9 b6 01 f1   .Kf.I.0....7....
    0030 - 38 bf f3 19 d0 4d 80 0b-0d 84 c3 8f ee 6a 7e be   8....M.......j~.
    0040 - 5c f6 9d e9 c1 b9 bb 2f-5c f6 39 a8 4a 4b 2a 74   \....../\.9.JK*t
    0050 - 7a 28 19 fe fa d7 bb d2-df d8 ff 92 7e 50 4f f3   z(..........~PO.
    0060 - 9f 86 82 54 c3 42 91 1c-de 3a fc 28 b9 65 c2 c6   ...T.B...:.(.e..
    0070 - c8 dc 98 a5 40 4b 72 bb-fc 4d 23 90 8b 42 f9 59   ....@Kr..M#..B.Y
    0080 - 3e 3e 36 8b 5b c5 1a 4a-79 d2 00 52 c0 b1 13 d3   >>6.[..Jy..R....
    0090 - 23 30 41 7b 01 b3 76 dd-26 8a 94 36 40 8e a0 1a   #0A{..v.&..6@...

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

6.2 SNI(Server Name Indication)対応サーバに接続する方法

SNIはSSL/TLSの拡張仕様の一つです。1つのIPで複数のSSL/TLS証明書を保持する技術です。TLSハンドシェイク時にクライアントがアクセスしたいホスト名を伝えることで、サーバ側がIPではなくホスト名によって異なる証明書を使い分けることができます。この設定がされたホストに接続するときは、SNIに必要なホスト名の情報を”servername"オプションで指定します。首相官邸のWebサーバにアクセスしてみます。

[root@server ~]# openssl s_client -connect www.kantei.go.jp:443 -servername www.kantei.go.jp
CONNECTED(00000003)
depth=2 OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
verify return:1
depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign RSA OV SSL CA 2018
verify return:1
depth=0 C = JP, ST = Tokyo, L = Chiyoda-ku, OU = Cabinet Public Relations Office, O = Cabinet Secretariat, CN = *.kantei.go.jp
verify return:1
---
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
 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
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIGfjCCBWagAwIBAgIMfqluVk7j4i9C++E/MA0GCSqGSIb3DQEBCwUAMFAxCzAJ
BgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMSYwJAYDVQQDEx1H
bG9iYWxTaWduIFJTQSBPViBTU0wgQ0EgMjAxODAeFw0yMTA4MjUwNDQ2MDJaFw0y
MjA5MjYwNDQ2MDJaMIGTMQswCQYDVQQGEwJKUDEOMAwGA1UECBMFVG9reW8xEzAR
BgNVBAcTCkNoaXlvZGEta3UxKDAmBgNVBAsTH0NhYmluZXQgUHVibGljIFJlbGF0
aW9ucyBPZmZpY2UxHDAaBgNVBAoTE0NhYmluZXQgU2VjcmV0YXJpYXQxFzAVBgNV
BAMMDioua2FudGVpLmdvLmpwMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
AQEA1/Wppfk+xMtGTQ6wXbZreK9kWFut+qZBZ+8oEZRscbAUvRTsUdF1XF8jkulC
FGZ7nqb2ytlJ51A/StzQrFnYP6l3CPth7Fkn+I8aWWt/6YbC4OUaFCcDZGwyo5+F
ugdy2Sex5qyWMcs1HkWzNsZii+MxyAcsqMpV0n5c1qY+I3T2ow8+oALBBIf9Kg4r
GQysVcHWczjo16FAOgzyitF8uaPY9oOdq8uBcx6C6QbNsK9LyOScBlUQJZfYVhqI
OryNPoFW1D6nNasXznrr5ENPdUztTvH90cpBSqQwLn3ikuUWhBlZEyhyJfL8ZNaE
F0iEsKANPnYOf8fqNsy0vASIBwIDAQABo4IDEjCCAw4wDgYDVR0PAQH/BAQDAgWg
MIGOBggrBgEFBQcBAQSBgTB/MEQGCCsGAQUFBzAChjhodHRwOi8vc2VjdXJlLmds
b2JhbHNpZ24uY29tL2NhY2VydC9nc3JzYW92c3NsY2EyMDE4LmNydDA3BggrBgEF
BQcwAYYraHR0cDovL29jc3AuZ2xvYmFsc2lnbi5jb20vZ3Nyc2FvdnNzbGNhMjAx
ODBWBgNVHSAETzBNMEEGCSsGAQQBoDIBFDA0MDIGCCsGAQUFBwIBFiZodHRwczov
L3d3dy5nbG9iYWxzaWduLmNvbS9yZXBvc2l0b3J5LzAIBgZngQwBAgIwCQYDVR0T
BAIwADAnBgNVHREEIDAegg4qLmthbnRlaS5nby5qcIIMa2FudGVpLmdvLmpwMB0G
A1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAfBgNVHSMEGDAWgBT473/yzXhn
qN5vjySNiPGHAwKz6zAdBgNVHQ4EFgQU/gqsahuC4X1e0kCJ6KlDmSL+WlcwggF+
BgorBgEEAdZ5AgQCBIIBbgSCAWoBaAB2ACl5vvCeOTkh8FZzn2Old+W+V32cYAr4
+U1dJlwlXceEAAABe3uhJnQAAAQDAEcwRQIgOfl6cFN2h7jjubBWjxC/Kirhmkyf
m9NrCNNmJzltf9ECIQChYCML2ZN7R7Hi4U+6gbUN0CsZ0X+SQo468ZCbzPiSKAB2
AFWB1MIWkDYBSuoLm1c8U/DA5Dh4cCUIFy+jqh0HE9MMAAABe3uhJpsAAAQDAEcw
RQIhAMbcLWECP2EgEapkQ8FaPQj/uLvRjRPMXWb6UTzLVzHeAiAf0Gcw6lQuLKY6
RWwtIVL9YGYz1wpBi1QlEvv7FHAsOwB2AEalVet1+pEgMLWiiWn0830RLEF0vv1J
uIWr8vxw/m1HAAABe3uhJrkAAAQDAEcwRQIhAJ50Qifl+lPkbJ5J0DQpIDLNo8Uc
pcehYJopDgW2T7UJAiB38hlotY9hwBK3mxQv2IHm78P59DQzB2vW8D7owOM49jAN
BgkqhkiG9w0BAQsFAAOCAQEAZaUIDQmIywFPkrQwL1CF4/sUSmi201v1unmBcA8P
qcJopulDtPyZT2aO3CXTfVV46aqwIDaorEJeHY9GqCBe7fnJvy08hgOWp2vnphbU
khUgmtCH+7Z8W6rySNunPnN3UxxXc+OZUYBWN526pbYnKTbUZN/Hsr/dIr2OmyQ9
iXbZLXyR4g61TTXRvxC2HvKwmxKi182zXyUproS0++5diYlDXoNGNbta+LhfW97G
s7wzhZ3sTaKoMtGS8tbUCPCrhyfn1iWeKGxiW410+YyjOf++4Kt9of4KQvEaQjXh
BHlZ2APoV/iTh+/R8HMjxEhH2pcxqAimkFLOit3RoUZhDA==
-----END CERTIFICATE-----
subject=/C=JP/ST=Tokyo/L=Chiyoda-ku/OU=Cabinet Public Relations Office/O=Cabinet Secretariat/CN=*.kantei.go.jp
issuer=/C=BE/O=GlobalSign nv-sa/CN=GlobalSign RSA OV SSL CA 2018
---
No client certificate CA names sent
Peer signing digest: SHA256
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 3408 bytes and written 440 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
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256
    Session-ID: 826E2DC111CB5EFB8BB188FCA470E6A583D169CF533EBB21BE02FD68E322CD98
    Session-ID-ctx:
    Master-Key: 4E806CC36BE007F64A4F8D8E4FB8BBB2395602047F45CB69B08C0F5D253C2C13A35F0B413A169B831CE13E4837DAF631
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    TLS session ticket lifetime hint: 86400 (seconds)
    TLS session ticket:
    0000 - 31 36 34 33 34 31 30 32-37 35 30 30 30 00 00 00   1643410275000...
    0010 - cd da 28 0a 52 9a 0a c2-f5 f1 9b 50 ec 3c c0 92   ..(.R......P.<..
    0020 - 3f d3 c3 24 45 e9 bb 9c-5e 4c b6 63 3f c6 e8 d9   ?..$E...^L.c?...
    0030 - 44 c4 2e 2c ed 3b fd 3b-3e 0a 43 82 42 93 91 53   D..,.;.;>.C.B..S
    0040 - f7 f2 e7 ee ec f9 c3 2a-be bc 62 06 22 3b 50 07   .......*..b.";P.
    0050 - f1 60 ad 33 ef 84 71 6a-5a 47 77 fe b6 c2 93 41   .`.3..qjZGw....A
    0060 - 62 7d 0b 03 4d 7d 3b ac-ab                        b}..M};..

    Start Time: 1643442022
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
^C

以前(2018年頃)、記事を執筆した際、"servername"オプションを指定しなくても、首相官邸のWebサーバにアクセスできたのですが、"servername"オプションを指定しないと、以下のようにエラーになります。どこかのタイミングでSNI対応になったのですかね。

[root@server ~]# openssl s_client -connect www.kantei.go.jp:443
---
SSL handshake has read 7 bytes and written 289 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
-snip-

6.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 = "Verizon Digital Media Services, Inc.", CN = www.example.org
Hash used: SHA256
Supported Elliptic Curve Point Formats: uncompressed:ansiX962_compressed_prime:ansiX962_compressed_char2
Server Temp Key: ECDH, P-256, 256 bits
^C

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

TLS1.2で接続してみます。

[root@server ~]# openssl s_client -connect www.google.com:443 -tls1_2 -brief
CONNECTION ESTABLISHED
Protocol version: TLSv1.2
Ciphersuite: ECDHE-RSA-AES128-GCM-SHA256
Peer certificate: CN = www.google.com
Hash used: SHA256
Supported Elliptic Curve Point Formats: uncompressed
Server Temp Key: ECDH, P-256, 256 bits
^C

TLS1.1で接続してみます。まだ、TLS1.1使えるのですね。。

[root@server ~]# openssl s_client -connect www.google.com:443 -tls1_1 -brief
CONNECTION ESTABLISHED
Protocol version: TLSv1.1
Ciphersuite: ECDHE-RSA-AES128-SHA
Peer certificate: CN = www.google.com
Supported Elliptic Curve Point Formats: uncompressed
Server Temp Key: ECDH, P-256, 256 bits
^C

6.5 証明書チェインを表示する方法(-showcerts)

ルートCAに至るまでの証明書チェインを確認してみます。depth=2がルートCA、depth=1が中間CA、depth=0がwww.example.comサーバ証明書になります。

[root@server ~]# openssl s_client -connect www.example.com:443 -showcerts
CONNECTED(00000003)
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
verify return:1
depth=1 C = US, O = DigiCert Inc, CN = DigiCert TLS RSA SHA256 2020 CA1
verify return:1
depth=0 C = US, ST = California, L = Los Angeles, O = "Verizon Digital Media Services, Inc.", CN = www.example.org
verify return:1
---
Certificate chain
 0 s:/C=US/ST=California/L=Los Angeles/O=Verizon Digital Media Services, Inc./CN=www.example.org
   i:/C=US/O=DigiCert Inc/CN=DigiCert TLS RSA SHA256 2020 CA1
-----BEGIN CERTIFICATE-----
MIIHNjCCBh6gAwIBAgIQAlIW4cSZjiYyql0dqYW0PDANBgkqhkiG9w0BAQsFADBP
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMSkwJwYDVQQDEyBE
aWdpQ2VydCBUTFMgUlNBIFNIQTI1NiAyMDIwIENBMTAeFw0yMTEyMTAwMDAwMDBa
Fw0yMjEyMDkyMzU5NTlaMIGBMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZv
cm5pYTEUMBIGA1UEBxMLTG9zIEFuZ2VsZXMxLTArBgNVBAoTJFZlcml6b24gRGln
aXRhbCBNZWRpYSBTZXJ2aWNlcywgSW5jLjEYMBYGA1UEAxMPd3d3LmV4YW1wbGUu
b3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoDBCVtcLoRG58wvs
zPJMsG8TAmvPB/OF8EKPxVSYgW56kzi2+kZCs1zmyTtZk2EkQyD1eonJd63/h8gI
24b13GF1ll/c8AjKOrleD/o3fGVqyggnHp3YCj+eENtFJZoDcrr1J9mw6zbUkzmM
EWxfMxRY5cCIxR96IRTM0qdfHHMf2QMgbnoI7xdO474owE/gcWMhBHePj0sr6Aui
vpd+UG+4Ozdjf6QMmf+WosN/ynwhuv2Q0T8FpDRw1oSOpQDcKXz9lstDrjmPLcat
2MIdm+RfnFGci/5tSWJbx80eGJbOxioHt3GAYHKsVxIAkEMPI76pcHHW5XuFo00F
iCHHIwIDAQABo4ID2TCCA9UwHwYDVR0jBBgwFoAUt2ui6qiqhIx56rTaD5iyxZV2
ufQwHQYDVR0OBBYEFG3g+qTIbys3Dg1NyBKa0QeBaGBEMIGBBgNVHREEejB4gg93
d3cuZXhhbXBsZS5vcmeCC2V4YW1wbGUubmV0ggtleGFtcGxlLmVkdYILZXhhbXBs
ZS5jb22CC2V4YW1wbGUub3Jngg93d3cuZXhhbXBsZS5jb22CD3d3dy5leGFtcGxl
LmVkdYIPd3d3LmV4YW1wbGUubmV0MA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAU
BggrBgEFBQcDAQYIKwYBBQUHAwIwgY8GA1UdHwSBhzCBhDBAoD6gPIY6aHR0cDov
L2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VExTUlNBU0hBMjU2MjAyMENBMS00
LmNybDBAoD6gPIY6aHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VExT
UlNBU0hBMjU2MjAyMENBMS00LmNybDA+BgNVHSAENzA1MDMGBmeBDAECAjApMCcG
CCsGAQUFBwIBFhtodHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwfwYIKwYBBQUH
AQEEczBxMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wSQYI
KwYBBQUHMAKGPWh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRM
U1JTQVNIQTI1NjIwMjBDQTEtMS5jcnQwDAYDVR0TAQH/BAIwADCCAX0GCisGAQQB
1nkCBAIEggFtBIIBaQFnAHYARqVV63X6kSAwtaKJafTzfREsQXS+/Um4havy/HD+
bUcAAAF9osbrcAAABAMARzBFAiEA5RwolQhRMWvTnyCNwRK/v/mG2S9Df0gRhXWK
pJuhG+YCIENHIK5yyKs3fLL9nlO9ckl5b9xbo8K3FP+N+keoBB+ZAHUAQcjKsd8i
RkoQxqE6CUKHXk4xixsD6+tLx2jwkGKWBvYAAAF9osbrPAAABAMARjBEAiB7M05v
Xh19tt1EbNsZEqb7/PrJRfeMOLz1O1UTOKCH1gIgf4nU/wBGtMERQuxeebdmf3wz
+5Q0pOgf2rEi4a016SUAdgDfpV6raIJPH2yt7rhfTj5a6s2iEqRqXo47EsAgRFwq
cwAAAX2ixut2AAAEAwBHMEUCIQDQjMsK3kzqSnGNY9Y5k0bLwo2/YN/2F0oaqXXi
NdOjJAIgFw06n1b8M6QdD98zAsRR4e52c0O7YzvrJXfRSE3JnfowDQYJKoZIhvcN
AQELBQADggEBAKVUNGn++wNr8agdWjZ5WY9cYqJjmQTQY3g5VkQMNaJiXIivehDU
TcFPqtfimTlVlVrfLGxYRAOZrzkGoQjUf99IKJW4ZUOQ0WDsKoaowU1qfzpGTwbr
jzmed2HbLlTP8NjQpYPMEIIiRQUC1iUK+0lf0UOq5mLJ3Cq3yL9UbOyhYTX9ha05
c5/nZHvhwCNvyie5RT6jWLcMH69hPS2DGiVr8HG4iV1W1F3/X+HeBOsEo1YyYlII
SCHB72Cijki2QiAHzPqy71H9MDt9jH2jbYKVRIDRJ20eF2Y1+rk7qQjwLoBM44Af
W9N7n6eEuv2HEWnaVBymoUjHaSEzYydzVOg=
-----END CERTIFICATE-----
 1 s:/C=US/O=DigiCert Inc/CN=DigiCert TLS RSA SHA256 2020 CA1
   i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root CA
-----BEGIN CERTIFICATE-----
MIIEvjCCA6agAwIBAgIQBtjZBNVYQ0b2ii+nVCJ+xDANBgkqhkiG9w0BAQsFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0yMTA0MTQwMDAwMDBaFw0zMTA0MTMyMzU5NTlaME8xCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxKTAnBgNVBAMTIERpZ2lDZXJ0IFRMUyBS
U0EgU0hBMjU2IDIwMjAgQ0ExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
AQEAwUuzZUdwvN1PWNvsnO3DZuUfMRNUrUpmRh8sCuxkB+Uu3Ny5CiDt3+PE0J6a
qXodgojlEVbbHp9YwlHnLDQNLtKS4VbL8Xlfs7uHyiUDe5pSQWYQYE9XE0nw6Ddn
g9/n00tnTCJRpt8OmRDtV1F0JuJ9x8piLhMbfyOIJVNvwTRYAIuE//i+p1hJInuW
raKImxW8oHzf6VGo1bDtN+I2tIJLYrVJmuzHZ9bjPvXj1hJeRPG/cUJ9WIQDgLGB
Afr5yjK7tI4nhyfFK3TUqNaX3sNk+crOU6JWvHgXjkkDKa77SU+kFbnO8lwZV21r
eacroicgE7XQPUDTITAHk+qZ9QIDAQABo4IBgjCCAX4wEgYDVR0TAQH/BAgwBgEB
/wIBADAdBgNVHQ4EFgQUt2ui6qiqhIx56rTaD5iyxZV2ufQwHwYDVR0jBBgwFoAU
A95QNVbRTLtm8KPiGxvDl7I90VUwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQG
CCsGAQUFBwMBBggrBgEFBQcDAjB2BggrBgEFBQcBAQRqMGgwJAYIKwYBBQUHMAGG
GGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBABggrBgEFBQcwAoY0aHR0cDovL2Nh
Y2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsUm9vdENBLmNydDBCBgNV
HR8EOzA5MDegNaAzhjFodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRH
bG9iYWxSb290Q0EuY3JsMD0GA1UdIAQ2MDQwCwYJYIZIAYb9bAIBMAcGBWeBDAEB
MAgGBmeBDAECATAIBgZngQwBAgIwCAYGZ4EMAQIDMA0GCSqGSIb3DQEBCwUAA4IB
AQCAMs5eC91uWg0Kr+HWhMvAjvqFcO3aXbMM9yt1QP6FCvrzMXi3cEsaiVi6gL3z
ax3pfs8LulicWdSQ0/1s/dCYbbdxglvPbQtaCdB73sRD2Cqk3p5BJl+7j5nL3a7h
qG+fh/50tx8bIKuxT8b1Z11dmzzp/2n3YWzW2fP9NsarA4h20ksudYbj/NhVfSbC
EXffPgK2fPOre3qGNm+499iTcc+G33Mw+nur7SpZyEKEOxEXGlLzyQ4UfaJbcme6
ce1XR2bFuAJKZTRei9AqPCCcUZlM51Ke92sRKw2Sfh3oius2FkOH6ipjv3U/697E
A7sKPPcw7+uvTPyLNhBzPvOk
-----END CERTIFICATE-----
---
Server certificate
subject=/C=US/ST=California/L=Los Angeles/O=Verizon Digital Media Services, Inc./CN=www.example.org
issuer=/C=US/O=DigiCert Inc/CN=DigiCert TLS RSA SHA256 2020 CA1
---
No client certificate CA names sent
Peer signing digest: SHA256
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 3725 bytes and written 415 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
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256
    Session-ID: 3F0C124E4F8E03F4005DA7574CAEE7A74613472F92B6A82857BAA4E9C4EC88EC
    Session-ID-ctx:
    Master-Key: 2B8F77CDF6C7A22E93BBD8CD9B65A8BE04144217BBD788080AE1F7E3DB95B362DC1278E888C3BEDFFF583176E42CA2CA
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    TLS session ticket lifetime hint: 7200 (seconds)
    TLS session ticket:
    0000 - 17 8a d9 8c 72 ee 2c f7-f4 22 77 33 97 5b 00 7c   ....r.,.."w3.[.|
    0010 - a6 c4 81 d2 7d 8b 8a 1f-a0 68 04 47 9f 9e 14 c6   ....}....h.G....
    0020 - b9 89 03 7c 74 cb 8d c2-4d a1 69 54 5a 1f 43 49   ...|t...M.iTZ.CI
    0030 - e8 29 c3 63 d2 67 7c 65-b0 5f 26 46 84 f7 e6 59   .).c.g|e._&F...Y
    0040 - e8 65 24 a4 3f 85 c2 f4-a4 03 87 f3 4c 69 b7 67   .e$.?.......Li.g
    0050 - 2d eb 29 39 c8 28 a6 9d-f8 fb 4f 47 28 5e bd 11   -.)9.(....OG(^..
    0060 - e4 a2 ce ac 97 e4 17 6a-d0 e8 36 d1 3f 59 19 0b   .......j..6.?Y..
    0070 - 73 b4 c3 a8 68 bd 2e 49-bf 61 82 4c 9e 8d 6a d5   s...h..I.a.L..j.
    0080 - d4 77 61 87 b5 5b 66 da-b3 b7 62 15 2a 24 46 fb   .wa..[f...b.*$F.
    0090 - 22 ea 0d 50 dd 7e f0 30-ed 43 b6 e1 ca c3 09 f5   "..P.~.0.C......

    Start Time: 1643195011
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
^C

6.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 Global Root CA
verify return:1
depth=1 C = US, O = DigiCert Inc, CN = DigiCert TLS RSA SHA256 2020 CA1
verify return:1
depth=0 C = US, ST = California, L = Los Angeles, O = "Verizon Digital Media Services, Inc.", CN = www.example.org
verify return:1
^C

6.7 TLSメッセージのやりとりを表示する方法(-msg)

msgオプションを使うと、TLSサーバとクライアントでやりとりするメッセージを表示することができます。ただし、msgオプションだけだと、メッセージが見にくいので、grepで絞り込みをしてみました。grepで絞り込んだ左端は、以下の意味になります。

  • >>> : TLSクライアントから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 0c09], Certificate
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
verify return:1
depth=1 C = US, O = DigiCert Inc, CN = DigiCert TLS RSA SHA256 2020 CA1
verify return:1
depth=0 C = US, ST = California, L = Los Angeles, O = "Verizon Digital Media Services, Inc.", 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
^C

6.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-----
MIIHNjCCBh6gAwIBAgIQAlIW4cSZjiYyql0dqYW0PDANBgkqhkiG9w0BAQsFADBP
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMSkwJwYDVQQDEyBE
aWdpQ2VydCBUTFMgUlNBIFNIQTI1NiAyMDIwIENBMTAeFw0yMTEyMTAwMDAwMDBa
Fw0yMjEyMDkyMzU5NTlaMIGBMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZv
cm5pYTEUMBIGA1UEBxMLTG9zIEFuZ2VsZXMxLTArBgNVBAoTJFZlcml6b24gRGln
aXRhbCBNZWRpYSBTZXJ2aWNlcywgSW5jLjEYMBYGA1UEAxMPd3d3LmV4YW1wbGUu
b3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoDBCVtcLoRG58wvs
zPJMsG8TAmvPB/OF8EKPxVSYgW56kzi2+kZCs1zmyTtZk2EkQyD1eonJd63/h8gI
24b13GF1ll/c8AjKOrleD/o3fGVqyggnHp3YCj+eENtFJZoDcrr1J9mw6zbUkzmM
EWxfMxRY5cCIxR96IRTM0qdfHHMf2QMgbnoI7xdO474owE/gcWMhBHePj0sr6Aui
vpd+UG+4Ozdjf6QMmf+WosN/ynwhuv2Q0T8FpDRw1oSOpQDcKXz9lstDrjmPLcat
2MIdm+RfnFGci/5tSWJbx80eGJbOxioHt3GAYHKsVxIAkEMPI76pcHHW5XuFo00F
iCHHIwIDAQABo4ID2TCCA9UwHwYDVR0jBBgwFoAUt2ui6qiqhIx56rTaD5iyxZV2
ufQwHQYDVR0OBBYEFG3g+qTIbys3Dg1NyBKa0QeBaGBEMIGBBgNVHREEejB4gg93
d3cuZXhhbXBsZS5vcmeCC2V4YW1wbGUubmV0ggtleGFtcGxlLmVkdYILZXhhbXBs
ZS5jb22CC2V4YW1wbGUub3Jngg93d3cuZXhhbXBsZS5jb22CD3d3dy5leGFtcGxl
LmVkdYIPd3d3LmV4YW1wbGUubmV0MA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAU
BggrBgEFBQcDAQYIKwYBBQUHAwIwgY8GA1UdHwSBhzCBhDBAoD6gPIY6aHR0cDov
L2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VExTUlNBU0hBMjU2MjAyMENBMS00
LmNybDBAoD6gPIY6aHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VExT
UlNBU0hBMjU2MjAyMENBMS00LmNybDA+BgNVHSAENzA1MDMGBmeBDAECAjApMCcG
CCsGAQUFBwIBFhtodHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwfwYIKwYBBQUH
AQEEczBxMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wSQYI
KwYBBQUHMAKGPWh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRM
U1JTQVNIQTI1NjIwMjBDQTEtMS5jcnQwDAYDVR0TAQH/BAIwADCCAX0GCisGAQQB
1nkCBAIEggFtBIIBaQFnAHYARqVV63X6kSAwtaKJafTzfREsQXS+/Um4havy/HD+
bUcAAAF9osbrcAAABAMARzBFAiEA5RwolQhRMWvTnyCNwRK/v/mG2S9Df0gRhXWK
pJuhG+YCIENHIK5yyKs3fLL9nlO9ckl5b9xbo8K3FP+N+keoBB+ZAHUAQcjKsd8i
RkoQxqE6CUKHXk4xixsD6+tLx2jwkGKWBvYAAAF9osbrPAAABAMARjBEAiB7M05v
Xh19tt1EbNsZEqb7/PrJRfeMOLz1O1UTOKCH1gIgf4nU/wBGtMERQuxeebdmf3wz
+5Q0pOgf2rEi4a016SUAdgDfpV6raIJPH2yt7rhfTj5a6s2iEqRqXo47EsAgRFwq
cwAAAX2ixut2AAAEAwBHMEUCIQDQjMsK3kzqSnGNY9Y5k0bLwo2/YN/2F0oaqXXi
NdOjJAIgFw06n1b8M6QdD98zAsRR4e52c0O7YzvrJXfRSE3JnfowDQYJKoZIhvcN
AQELBQADggEBAKVUNGn++wNr8agdWjZ5WY9cYqJjmQTQY3g5VkQMNaJiXIivehDU
TcFPqtfimTlVlVrfLGxYRAOZrzkGoQjUf99IKJW4ZUOQ0WDsKoaowU1qfzpGTwbr
jzmed2HbLlTP8NjQpYPMEIIiRQUC1iUK+0lf0UOq5mLJ3Cq3yL9UbOyhYTX9ha05
c5/nZHvhwCNvyie5RT6jWLcMH69hPS2DGiVr8HG4iV1W1F3/X+HeBOsEo1YyYlII
SCHB72Cijki2QiAHzPqy71H9MDt9jH2jbYKVRIDRJ20eF2Y1+rk7qQjwLoBM44Af
W9N7n6eEuv2HEWnaVBymoUjHaSEzYydzVOg=
-----END CERTIFICATE-----
-snip-

fileコマンドでサーバ証明書のファイル形式を確認をします。PEM形式であることがわかります。なお、PEMファイルの判定処理は/usr/share/magicに記述されています。

[root@server ~]# file example.pem
example.pem: PEM certificate

7 s_serverコマンドの使い方

s_serverは、TLSサーバとして動作するコマンドです。

[root@server ~]# man s_server
S_SERVER(1)                                            OpenSSL                                            S_SERVER(1)

NAME
       s_server - SSL/TLS server program

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

事前準備として、秘密鍵サーバ証明書を作成します。まず、秘密鍵(private.key)を作成します。

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

秘密鍵をもとに証明書署名要求(server.csr)を作成します。

[root@server ~]# openssl req -new -key private.key -out server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
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=XX/L=Default City/O=Default Company Ltd/CN=server
Getting Private key

作成したファイルを確認します。ファイルは、それぞれ、以下のとおりです。
・private.key:秘密鍵
・server.csr:証明書署名要求
・server.crt:サーバ証明書

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

7.2 基本的な使い方

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

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

lsof コマンドを使って、opensslプロセスがListenしているポート番号を確認します。4433番ポートでListenしていることがわかります。
lsofコマンドの使い方は、lsofコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# lsof -c openssl -a -i -a -n -a -P
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
openssl 5951 root    3u  IPv6  77553      0t0  TCP *:4433 (LISTEN)

クライアントからTLSサーバに接続するため、サーバの4433番ポートを開放します。firewall-cmdの詳細な使い方は、firewall-cmdの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# firewall-cmd --add-port=4433/tcp
success
[root@server ~]# firewall-cmd --list-ports
4433/tcp

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

[root@client ~]# openssl s_client -connect 192.168.2.100:4433
CONNECTED(00000003)
depth=0 C = XX, L = Default City, O = Default Company Ltd, CN = server
verify error:num=18:self signed certificate
verify return:1
depth=0 C = XX, L = Default City, O = Default Company Ltd, CN = server
verify return:1
---
Certificate chain
 0 s:/C=XX/L=Default City/O=Default Company Ltd/CN=server
   i:/C=XX/L=Default City/O=Default Company Ltd/CN=server
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDIjCCAgoCCQCkyuumDadbhzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJY
WDEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5MRwwGgYDVQQKDBNEZWZhdWx0IENvbXBh
bnkgTHRkMQ8wDQYDVQQDDAZzZXJ2ZXIwHhcNMjIwMTI2MTMyMzE2WhcNMjIwMjI1
MTMyMzE2WjBTMQswCQYDVQQGEwJYWDEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5MRww
GgYDVQQKDBNEZWZhdWx0IENvbXBhbnkgTHRkMQ8wDQYDVQQDDAZzZXJ2ZXIwggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDX0FI9oAXqvMDr0QmaWvJJdsBW
nUcKpd9KXK6oZgPoOFvztIkDors22dZKZeAI04C2EpTd1+Xd33PGTT4iT5fQNTPY
rtqE/O49qbUBFHu5f2953MmTA/GUyQQ9nXKIRNllcrdfxs2wix3QVJEGTIo/ChDC
81EJfIlm4xVduP8V6/N3zzbn86Utt5WSWqfm4Uh2mz+nv24tj7z5y/M2jH5cmL8K
kvsxPvB3TScJCVmgfZH5n2Ow2MuTASD7Kht3xmRnZlhdM6wB1F1B1iBcHH8odiXN
Xc7XdRQLzGpV/8IWhL+kOyECIh35oXaqEfWgS+qI3cv+pCYexAqXhbOfm2TjAgMB
AAEwDQYJKoZIhvcNAQELBQADggEBAGEJUido2sKMNRHZGilbf7XHwtbhMGSGgm88
TLUCQfRh6Mm+TqBhW76tDYQM9KzG/MzWgx/X53sTMhuqWZW6s/LtYrjs/OuMk+1l
V7nl3yrwy9hC2UGCgNIRmLxfM/HQ89Aq5r2jRd6RREDhCmlqkEquQtgjJ1As8REI
kpm1zWhvcepoQRw2VH7KEB3DyQDYyeznajBV5Q24gw1csP7MLQ7QQ37ZRg6vYArG
HByxHYokY7/uI0KDAwkVFaEQuq8JKDI6ggL6ablgHjs6J7nHCUWXT7eefURN5Him
m6O58aC41tDKnuG5z3lLHBFVgRdngW/qeYydxDQOF5tGOyTS4gE=
-----END CERTIFICATE-----
subject=/C=XX/L=Default City/O=Default Company Ltd/CN=server
issuer=/C=XX/L=Default City/O=Default Company Ltd/CN=server
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 1465 bytes and written 415 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: E62F37263DC4ABCC106BD3CBF7AF3192AD2DA200A572908CB9B846F9E1FE3CD2
    Session-ID-ctx:
    Master-Key: 64582D4DA6F9571C8A622397C977D875A17E6161CDD7337EBCD01A8DF3BCCE304D06A3B06D4E4C7B1DF7318DF144FA4D
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - 52 2d 3b 1d ab 5f 1a b6-1f 8f 9a 63 32 bd 27 64   R-;.._.....c2.'d
    0010 - 16 a3 ca a1 71 4a 12 fc-6b 1c 0d 35 ba 6f f1 c4   ....qJ..k..5.o..
    0020 - 7a 5e 6e c8 60 3f 45 aa-b7 f0 00 43 d6 12 45 8b   z^n.`?E....C..E.
    0030 - cb ad d4 36 56 18 82 a9-2e 30 b7 14 81 a4 c0 a1   ...6V....0......
    0040 - 10 39 dd ec 36 b3 17 b9-e9 c9 ab 7f 93 73 d3 b3   .9..6........s..
    0050 - 3e a6 f8 46 92 fe 97 09-cf 34 cc 7e 89 9c c2 95   >..F.....4.~....
    0060 - 0c ea 9a 50 ff a1 b9 6c-57 4d 4f 68 11 3c c4 35   ...P...lWMOh.<.5
    0070 - d8 a0 94 0d de 73 2d ae-b0 03 54 f7 e0 dd c0 23   .....s-...T....#
    0080 - 51 cd 66 99 23 1b b7 71-b0 52 3d 10 a7 31 53 c3   Q.f.#..q.R=..1S.
    0090 - 87 c4 38 93 ec 50 e2 8d-2d 33 b3 aa 9d dd 89 cd   ..8..P..-3......

    Start Time: 1643203901
    Timeout   : 300 (sec)
    Verify return code: 18 (self signed certificate)
---
^C

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

opensslサーバが、デフォルトの4433番ポートではなく、11111番ポートでListenしてみます。

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

TCPの11111番ポートを開放します。

[root@server ~]# firewall-cmd --add-port=11111/tcp
success

ポートの状態を確認します。TCPの11111番ポートが開放されたことがわかります。

[root@server ~]# firewall-cmd --list-ports
11111/tcp

lsofコマンドを実行します。opensslプロセスがTCPの11111番ポートでLISTENしていることがわかります。

[root@server ~]# lsof -c openssl -a -i -a -P
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
openssl 2877 root    3u  IPv6  42565      0t0  TCP *:11111 (LISTEN)

クライアントからサーバに接続します。

[root@client ~]# openssl s_client -connect server:11111
CONNECTED(00000003)
depth=0 C = XX, L = Default City, O = Default Company Ltd, CN = server
verify error:num=18:self signed certificate
verify return:1
depth=0 C = XX, L = Default City, O = Default Company Ltd, CN = server
verify return:1
---
Certificate chain
 0 s:/C=XX/L=Default City/O=Default Company Ltd/CN=server
   i:/C=XX/L=Default City/O=Default Company Ltd/CN=server
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDIjCCAgoCCQCkyuumDadbhzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJY
WDEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5MRwwGgYDVQQKDBNEZWZhdWx0IENvbXBh
bnkgTHRkMQ8wDQYDVQQDDAZzZXJ2ZXIwHhcNMjIwMTI2MTMyMzE2WhcNMjIwMjI1
MTMyMzE2WjBTMQswCQYDVQQGEwJYWDEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5MRww
GgYDVQQKDBNEZWZhdWx0IENvbXBhbnkgTHRkMQ8wDQYDVQQDDAZzZXJ2ZXIwggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDX0FI9oAXqvMDr0QmaWvJJdsBW
nUcKpd9KXK6oZgPoOFvztIkDors22dZKZeAI04C2EpTd1+Xd33PGTT4iT5fQNTPY
rtqE/O49qbUBFHu5f2953MmTA/GUyQQ9nXKIRNllcrdfxs2wix3QVJEGTIo/ChDC
81EJfIlm4xVduP8V6/N3zzbn86Utt5WSWqfm4Uh2mz+nv24tj7z5y/M2jH5cmL8K
kvsxPvB3TScJCVmgfZH5n2Ow2MuTASD7Kht3xmRnZlhdM6wB1F1B1iBcHH8odiXN
Xc7XdRQLzGpV/8IWhL+kOyECIh35oXaqEfWgS+qI3cv+pCYexAqXhbOfm2TjAgMB
AAEwDQYJKoZIhvcNAQELBQADggEBAGEJUido2sKMNRHZGilbf7XHwtbhMGSGgm88
TLUCQfRh6Mm+TqBhW76tDYQM9KzG/MzWgx/X53sTMhuqWZW6s/LtYrjs/OuMk+1l
V7nl3yrwy9hC2UGCgNIRmLxfM/HQ89Aq5r2jRd6RREDhCmlqkEquQtgjJ1As8REI
kpm1zWhvcepoQRw2VH7KEB3DyQDYyeznajBV5Q24gw1csP7MLQ7QQ37ZRg6vYArG
HByxHYokY7/uI0KDAwkVFaEQuq8JKDI6ggL6ablgHjs6J7nHCUWXT7eefURN5Him
m6O58aC41tDKnuG5z3lLHBFVgRdngW/qeYydxDQOF5tGOyTS4gE=
-----END CERTIFICATE-----
subject=/C=XX/L=Default City/O=Default Company Ltd/CN=server
issuer=/C=XX/L=Default City/O=Default Company Ltd/CN=server
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 1465 bytes and written 415 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: 736407887795E0B201B217A302523392A6663D2B6C8AE79CEE49416DC51BC985
    Session-ID-ctx:
    Master-Key: B0C632137E56067450C33F18E23D37870ADA03F32881C74A16E9C72198E0759CD6EF6316801CD906EDD59F811DD25DC3
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - ef 2d e5 d3 6e ab de de-23 34 b9 a6 95 bc aa 76   .-..n...#4.....v
    0010 - 89 f6 75 8a 5c 98 17 e5-1a 2b bb 0c f6 76 04 be   ..u.\....+...v..
    0020 - b8 83 23 55 9c b1 84 87-e4 5c d0 34 e4 21 fb ce   ..#U.....\.4.!..
    0030 - ca cb 0a d3 0d 31 b9 a3-9e 17 97 bc d6 f1 2e c4   .....1..........
    0040 - 62 af 91 44 50 47 08 7e-59 9e cc 88 74 f6 1a cc   b..DPG.~Y...t...
    0050 - 21 ea 9a 6d 27 ca 62 0a-ba 45 22 46 bd 6a 9c 62   !..m'.b..E"F.j.b
    0060 - 68 95 9a fd ab fc b9 b4-fc b7 b6 0c c5 24 df a0   h............$..
    0070 - 74 de a3 5f c7 62 5d 3f-bf c3 04 35 30 5a 58 09   t.._.b]?...50ZX.
    0080 - 55 cc 81 ec 43 73 67 15-96 d2 24 ec 56 82 90 99   U...Csg...$.V...
    0090 - 12 e4 b9 b2 6d e5 c8 c0-27 2b c1 ee ff 17 c3 e5   ....m...'+......

    Start Time: 1643286509
    Timeout   : 300 (sec)
    Verify return code: 18 (self signed certificate)
---

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

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

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

curlコマンドを使ってwebサーバにアクセスします。webサーバより"Hello World"を受信していることがわかります。

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

8 X509コマンドの使い方

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

[root@server ~]# man x509
X509(1)                                            OpenSSL                                            X509(1)

NAME
       x509 - Certificate display and signing utility

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

事前準備として、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

サーバ証明書を確認してみます。

[root@server ~]# openssl x509 -in example.pem -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            02:52:16:e1:c4:99:8e:26:32:aa:5d:1d:a9:85:b4:3c
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=DigiCert Inc, CN=DigiCert TLS RSA SHA256 2020 CA1
        Validity
            Not Before: Dec 10 00:00:00 2021 GMT
            Not After : Dec  9 23:59:59 2022 GMT
        Subject: C=US, ST=California, L=Los Angeles, O=Verizon Digital Media Services, Inc., CN=www.example.org
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:a0:30:42:56:d7:0b:a1:11:b9:f3:0b:ec:cc:f2:
                    4c:b0:6f:13:02:6b:cf:07:f3:85:f0:42:8f:c5:54:
                    98:81:6e:7a:93:38:b6:fa:46:42:b3:5c:e6:c9:3b:
                    59:93:61:24:43:20:f5:7a:89:c9:77:ad:ff:87:c8:
                    08:db:86:f5:dc:61:75:96:5f:dc:f0:08:ca:3a:b9:
                    5e:0f:fa:37:7c:65:6a:ca:08:27:1e:9d:d8:0a:3f:
                    9e:10:db:45:25:9a:03:72:ba:f5:27:d9:b0:eb:36:
                    d4:93:39:8c:11:6c:5f:33:14:58:e5:c0:88:c5:1f:
                    7a:21:14:cc:d2:a7:5f:1c:73:1f:d9:03:20:6e:7a:
                    08:ef:17:4e:e3:be:28:c0:4f:e0:71:63:21:04:77:
                    8f:8f:4b:2b:e8:0b:a2:be:97:7e:50:6f:b8:3b:37:
                    63:7f:a4:0c:99:ff:96:a2:c3:7f:ca:7c:21:ba:fd:
                    90:d1:3f:05:a4:34:70:d6:84:8e:a5:00:dc:29:7c:
                    fd:96:cb:43:ae:39:8f:2d:c6:ad:d8:c2:1d:9b:e4:
                    5f:9c:51:9c:8b:fe:6d:49:62:5b:c7:cd:1e:18:96:
                    ce:c6:2a:07:b7:71:80:60:72:ac:57:12:00:90:43:
                    0f:23:be:a9:70:71:d6:e5:7b:85:a3:4d:05:88:21:
                    c7:23
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Authority Key Identifier:
                keyid:B7:6B:A2:EA:A8:AA:84:8C:79:EA:B4:DA:0F:98:B2:C5:95:76:B9:F4

            X509v3 Subject Key Identifier:
                6D:E0:FA:A4:C8:6F:2B:37:0E:0D:4D:C8:12:9A:D1:07:81:68:60:44
            X509v3 Subject Alternative Name:
                DNS:www.example.org, DNS:example.net, DNS:example.edu, DNS:example.com, 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/DigiCertTLSRSASHA2562020CA1-4.crl

                Full Name:
                  URI:http://crl4.digicert.com/DigiCertTLSRSASHA2562020CA1-4.crl

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

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

            X509v3 Basic Constraints: critical
                CA:FALSE
            CT Precertificate SCTs:
                Signed Certificate Timestamp:
                    Version   : v1(0)
                    Log ID    : 46:A5:55:EB:75:FA:91:20:30:B5:A2:89:69:F4:F3:7D:
                                11:2C:41:74:BE:FD:49:B8:85:AB:F2:FC:70:FE:6D:47
                    Timestamp : Dec 10 05:18:05.168 2021 GMT
                    Extensions: none
                    Signature : ecdsa-with-SHA256
                                30:45:02:21:00:E5:1C:28:95:08:51:31:6B:D3:9F:20:
                                8D:C1:12:BF:BF:F9:86:D9:2F:43:7F:48:11:85:75:8A:
                                A4:9B:A1:1B:E6:02:20:43:47:20:AE:72:C8:AB:37:7C:
                                B2:FD:9E:53:BD:72:49:79:6F:DC:5B:A3:C2:B7:14:FF:
                                8D:FA:47:A8:04:1F:99
                Signed Certificate Timestamp:
                    Version   : v1(0)
                    Log ID    : 41:C8:CA:B1:DF:22:46:4A:10:C6:A1:3A:09:42:87:5E:
                                4E:31:8B:1B:03:EB:EB:4B:C7:68:F0:90:62:96:06:F6
                    Timestamp : Dec 10 05:18:05.116 2021 GMT
                    Extensions: none
                    Signature : ecdsa-with-SHA256
                                30:44:02:20:7B:33:4E:6F:5E:1D:7D:B6:DD:44:6C:DB:
                                19:12:A6:FB:FC:FA:C9:45:F7:8C:38:BC:F5:3B:55:13:
                                38:A0:87:D6:02:20:7F:89:D4:FF:00:46:B4:C1:11:42:
                                EC:5E:79:B7:66:7F:7C:33:FB:94:34:A4:E8:1F:DA:B1:
                                22:E1:AD:35:E9:25
                Signed Certificate Timestamp:
                    Version   : v1(0)
                    Log ID    : DF:A5:5E:AB:68:82:4F:1F:6C:AD:EE:B8:5F:4E:3E:5A:
                                EA:CD:A2:12:A4:6A:5E:8E:3B:12:C0:20:44:5C:2A:73
                    Timestamp : Dec 10 05:18:05.174 2021 GMT
                    Extensions: none
                    Signature : ecdsa-with-SHA256
                                30:45:02:21:00:D0:8C:CB:0A:DE:4C:EA:4A:71:8D:63:
                                D6:39:93:46:CB:C2:8D:BF:60:DF:F6:17:4A:1A:A9:75:
                                E2:35:D3:A3:24:02:20:17:0D:3A:9F:56:FC:33:A4:1D:
                                0F:DF:33:02:C4:51:E1:EE:76:73:43:BB:63:3B:EB:25:
                                77:D1:48:4D:C9:9D:FA
    Signature Algorithm: sha256WithRSAEncryption
         a5:54:34:69:fe:fb:03:6b:f1:a8:1d:5a:36:79:59:8f:5c:62:
         a2:63:99:04:d0:63:78:39:56:44:0c:35:a2:62:5c:88:af:7a:
         10:d4:4d:c1:4f:aa:d7:e2:99:39:55:95:5a:df:2c:6c:58:44:
         03:99:af:39:06:a1:08:d4:7f:df:48:28:95:b8:65:43:90:d1:
         60:ec:2a:86:a8:c1:4d:6a:7f:3a:46:4f:06:eb:8f:39:9e:77:
         61:db:2e:54:cf:f0:d8:d0:a5:83:cc:10:82:22:45:05:02:d6:
         25:0a:fb:49:5f:d1:43:aa:e6:62:c9:dc:2a:b7:c8:bf:54:6c:
         ec:a1:61:35:fd:85:ad:39:73:9f:e7:64:7b:e1:c0:23:6f:ca:
         27:b9:45:3e:a3:58:b7:0c:1f:af:61:3d:2d:83:1a:25:6b:f0:
         71:b8:89:5d:56:d4:5d:ff:5f:e1:de:04:eb:04:a3:56:32:62:
         52:08:48:21:c1:ef:60:a2:8e:48:b6:42:20:07:cc:fa:b2:ef:
         51:fd:30:3b:7d:8c:7d:a3:6d:82:95:44:80:d1:27:6d:1e:17:
         66:35:fa:b9:3b:a9:08:f0:2e:80:4c:e3:80:1f:5b:d3:7b:9f:
         a7:84:ba:fd:87:11:69:da:54:1c:a6:a1:48:c7:69:21:33:63:
         27:73:54:e8

サーバ証明書に登録されている、国名(C)、組織名(O)、コモン名(CN)等のサブジェクトを確認してみます。

[root@server ~]# openssl x509 -in example.pem -noout -subject
subject= /C=US/ST=California/L=Los Angeles/O=Verizon Digital Media Services, Inc./CN=www.example.org

シリアル番号を確認してみます。

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

www.example.orgサーバ証明書を発行した中間CAの情報を確認してみます。DigiCertという中間CAがサーバ証明書の発行元であることがわかります

[root@server ~]# openssl x509 -in example.pem -noout -issuer
issuer= /C=US/O=DigiCert Inc/CN=DigiCert TLS RSA SHA256 2020 CA1

OCSP(Online Certificate Status Protocol)は、X.509公開鍵証明書の失効状態を取得するための通信プロトコルです。

[root@server ~]# openssl x509 -in example.pem -noout -ocsp_uri
http://ocsp.digicert.com

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

[root@server ~]# openssl x509 -in example.pem -noout -pubkey
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoDBCVtcLoRG58wvszPJM
sG8TAmvPB/OF8EKPxVSYgW56kzi2+kZCs1zmyTtZk2EkQyD1eonJd63/h8gI24b1
3GF1ll/c8AjKOrleD/o3fGVqyggnHp3YCj+eENtFJZoDcrr1J9mw6zbUkzmMEWxf
MxRY5cCIxR96IRTM0qdfHHMf2QMgbnoI7xdO474owE/gcWMhBHePj0sr6Auivpd+
UG+4Ozdjf6QMmf+WosN/ynwhuv2Q0T8FpDRw1oSOpQDcKXz9lstDrjmPLcat2MId
m+RfnFGci/5tSWJbx80eGJbOxioHt3GAYHKsVxIAkEMPI76pcHHW5XuFo00FiCHH
IwIDAQAB
-----END PUBLIC KEY-----

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

秘密鍵(private.key)を作成します。

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

秘密鍵をもとに証明書署名要求(server.csr)を作成します。

[root@server ~]# openssl req -new -key private.key -out server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
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 []:

PEM形式でサーバ証明書(server.crt)を作成します。outオプションで生成するファイル名を指定します。PEM形式であることがわかるように、拡張子をpemにしました。

[root@server ~]#  openssl x509 -req -in server.csr -signkey private.key -out server.pem -outform PEM
Signature ok
subject=/C=XX/L=Default City/O=Default Company Ltd/CN=server
Getting Private key

ファイルタイプを確認します。PEM形式であることがわかります。

[root@server ~]# file server.pem
server.pem: PEM certificate

8.3 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
Signature ok
subject=/C=XX/L=Default City/O=Default Company Ltd/CN=server
Getting Private key

ファイルタイプを確認します。

[root@server ~]# file server.der
server.der: data

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

ファイルタイプを確認します。

[root@server ~]# file server.der
server.der: data

DER形式からPEM形式に変換します。

[root@server ~]# openssl x509 -in server.der -inform DER -out server.pem -outform PEM

ファイルタイプを確認します。PEM形式に変換されたことがわかります。

[root@server ~]# file server.pem
server.pem: PEM certificate

9 ciphersコマンドの使い方

ciphersコマンドは、暗号スイートを表示するコマンドです。暗号スイートとは、暗号アルゴリズムハッシュ関数、鍵長などの組み合わせのことで、IETF で規格化されています。

[root@server ~]# man ciphers
CIPHERS(1)                                         OpenSSL                                         CIPHERS(1)

NAME
       ciphers - SSL cipher display and cipher list tool.

暗号スイートを表示してみます。

[root@server ~]# 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
ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA384
-snip-

10 dgstコマンドの使い方

dgstコマンドは、メッセージダイジェストを計算するときに使います。メッセージダイジェストとは、ハッシュ関数が生成する値です。

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

テスト用のファイルを作成します。fallocateコマンドの使い方は、ファイルの作り方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# fallocate -l 1K test.dat

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

[root@server ~]# ls -lh test.dat
-rw-------. 1 root root 184M  1月 27 22:30 test.dat

sha512コマンドを使って、テスト用ファイルのダイジェストを計算してみます。

[root@server ~]# openssl dgst -sha512 test.dat
SHA512(test.dat)= f864bc9a82147b542d2334a1072a050e79ec7ede1d8818258686b201ffc2a45eab8a92243f996d83b71065f8e17a7e3a805840618779e87de641470ac206dd33

11 rsautlコマンドの使いかた

rsautlコマンドを使って、公開鍵で暗号化したファイルを秘密鍵で復号してみます。

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

NAME
       rsautl - RSA utility
-snip-

11.1 事前準備

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

[root@server ~]# echo "1234567890" > test.txt

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

[root@server ~]# cat test.txt
1234567890

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

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

作成した秘密鍵のファイルタイプを確認します。

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

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

[root@server ~]# openssl rsa -in priv.key -pubout -out pub.key
writing RSA key
[root@server ~]# cat pub.key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1v301jCzsJjWzivUoFYE
yQZJNLsKZfoyYBx2SFemeZHs+fQqjxmr73bEBrJOzbnDxmAsacuqeYC46cnfOlMe
P8wKxoowjQ8lnUUJ9p+qkqECIce2aTnjcxmf/RdH75yKpnygDEE17HjV435MTBJ8
gQAd0v9hV4qaomNJKG3xPkFhgmy5mfpdGA3kYzA1Q5x7ygc/3Jt4UH4CBtird33g
K4eXdsKI9XIFmhtjcbc1sOXyNIPsYLv+KthvHvZIH3/dhNX07B1XnW66GMxRwnAA
OkSTUU6cSxZVTKcAuWuvIZvNIqc8MSWSeC5CLJLjxbPJtPNCdFyPpy7e7fhVScKL
vQIDAQAB
-----END PUBLIC KEY-----

11.2 暗号化および復号

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

[root@server ~]# openssl rsautl -encrypt -pubin -inkey pub.key -in test.txt -out test.txt.enc

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

[root@server ~]# file test.txt.enc
test.txt.enc: data

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

[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

12 ブラウザで証明書を確認する方法

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

首相官邸ホームページの証明書チェインを確認してみます。

f:id:hana_shin:20220129100819p:plain
openssl-01
f:id:hana_shin:20220129100831p:plain
openssl-02

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

f:id:hana_shin:20220129100907p:plain
openssl-03

ブラウザに表示されたルートCAまでの証明書チェインは以下のとおりです。ルートCAのCN(Common Name)は"GlobalSign"となっていました。

CN=GlobalSign
 + CN=GlobalSign RSA OV SSL CA 2018
    + CN=*.kantei.co.jp

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

ブラウザにインストールされているルートCAの証明書を確認してみます。ここでは、"GlobalSign"のルートCAの証明書がインストールされていることを確認してみます。

f:id:hana_shin:20220129100938p:plain
openssl-04
f:id:hana_shin:20220129100952p:plain
openssl-05

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

首相官邸ホームページにアクセスした際、webサーバから送られてくる証明書の確認方法について説明します。
首相官邸のwebサーバにアクセスします。

[root@server ~]# openssl s_client -connect www.kantei.go.jp:443 -servername www.kantei.go.jp -showcerts < /dev/null

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

[root@server ~]#  openssl s_client -connect www.kantei.go.jp:443 -servername www.kantei.go.jp -showcerts < /dev/null
-snip-
---
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
-snip-
 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
-snip-

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ