zkat’s diary

技術ブログ

WebTrust基準とBaseline Requirementsの改訂バージョンについて

ブラウザベンダに信用された認証局になる為の一つの要件として、
WebTrust認証を受けていることが挙げられると思います。

WebTrust認証を受けるに値するかは、下記の基準に基づき適切な監査人によって判断されます。

www.webtrust.org

上記の監査基準については、Baseline Requrements(以下、BR)への参照が数多く存在します。
BRは頻繁に改定されていますが、監査実施時に上記基準が参照するBRよりも新しい版が存在する場合 どの版が適用されるのでしょうか。

基準を確認すると下記のような記載がありました

The Forum may periodically publish updated Guidelines and Requirements. The auditor is generally not required to consider these updated versions until reflected in the subsequently updated Audit Criteria. However, in certain circumstances whereby a previous requirement or guidelines is eliminated or made less restrictive, the auditor may consider those changes as of their effective dates even if the changes are not reflected in the most current Audit Criteria.

端的に言うと、新たな版があってもそれを取り込んだ新たなAudit Criteria(本基準)がない場合は 特に考慮する必要がないようです。但し書きで、新しい版で要件の緩和がある場合はそれを考慮に入れてもよいといった風に読めます。

つまり監査人次第ということでしょうか。

FREDをインストールしてTLDゾーンのレジストリになる

はじめに

タイトルの通り、cz.nic が作っているFRED(Free Registry for ENUM and Domains)をインストールして、適当なTLDゾーンを作ってみたいと思います。
IANAから正式に委任されているTLD*1を使うのは気が引けるので、今回は example を TLDとしてみます。

インストール

今回インストールをする環境情報です。Ubuntu 16.04 でやりたいと思います。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.4 LTS
Release:        16.04
Codename:       xenial
fred@ubuntu:~$ uname -a
Linux ubuntu 4.4.0-119-generic #143-Ubuntu SMP Mon Apr 2 16:08:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

公式の手順に従い、 何も考えずに Installation script を叩いてみます。

1.2. Installation of binaries on Ubuntu — FRED 2.37 Documentation

$ sudo su -
# wget https://fred.nic.cz/files/fred/fred-ubuntu-install.sh
# . fred-ubuntu-install.sh

上記シェルスクリプトが何をしているかは、Installation stepsに書いてあります。

TLDゾーンの作成

つづいて TLDゾーンの作成に移ります。やり方は2つ存在するようです。 1つは、ゾーンのセットアップスクリプトを実行する方法。2つめは、手動でコマンドをたたいていく方法。 1つめの方法を公式から引用します。

$ wget https://fred.nic.cz/files/fred/fred-config-zone.py
$ python fred-config-zone.py cz > fred-config-cz.sh
$ . fred-config-cz.sh

上記スクリプト fred-config-zone.py は 作成したい TLD名を引数にとるスクリプトで、 TLDゾーンのセットアップ用のコマンドを標準出力に出力します。 但し、上記スクリプトには実在するTLD名を与えないと動かないようです。
どうもTLDゾーンのSOA等を引いて、セットアップ用に値を取ってきているようです。(シリアルとかTTLとか)

とういうことで、2つめの方法、コマンドを愚直に叩いていく方法でセットアップをしていこうと思います。 セットアップは以下の流れで実施する必要がある様です。
それぞれのタスクは、インストール時に作られた fred-adminというコマンドで行えるようです。fred-admin --help で詳細な使い方が分かります。

1.ゾーンの作成

コマンドを実行します。

$ fred-admin --zone_add \
    --zone_fqdn=example \
    --ex_period_min=12 \
    --ex_period_max=120 \
    --ttl=18000 \
    --hostmaster=hostmaster@nic.example \
    --refresh=900 \
    --update_retr=300 \
    --expiry=604800 \
    --minimum=900 \
    --ns_fqdn=a.dns.example

--ex_period_minは登録可能期間の最小値(月単位)、--ex_period_maxは登録可能期間の最大値(月単位) を表しているようです。
それ以外のオプションは、TLDゾーンのSOAレコードに記載される値です。

つづいて、TLDゾーンの権威DNSサーバーを登録します。

$ fred-admin --zone_ns_add --zone_fqdn=example --ns_fqdn=a.dns.example --addr=127.0.0.1

2. レジストラアカウントの作成

作成できるレジストラのタイプは、common registrar と system registrar の2つが存在するようです。
system registrar については、レジストリ自身がゾーンの情報を変更するためのアカウントで、
common registrarアカウントはそれ以外の目的のアカウントとなる様です。
system registrarを作成し認証情報を設定し、example ゾーンへの権限を追加します。
認証情報の設定については、fred-clientが使用するクライアント証明書(/usr/share/fred-client/ssl/test-cert.pem)のfingerprintを正しく設定する必要があります。 フィンガープリントの作り方は以下の通り。

$ openssl x509 -noout -fingerprint -md5 -in /path/to/cert.pem | cut -d= -f2
$ fred-admin --registrar_add --handle=REG-SYS --reg_name="System registrar" --country=JP --system
$ fred-admin --registrar_acl_add --handle=REG-SYS --certificate="上記で作ったfingerprintの値。16新数2桁のコロン区切り" --password=passwd
$ fred-admin --registrar_add_zone --zone_fqdn=example --handle=REG-SYS

3. 課金情報の作成

EPPにおけるそれぞれの操作に対応した形で課金情報の設定をする事ができるようです。
CreateDomainにはいくら、RenewDomainにはいくら、それ以外のEPP操作にはいくら という感じです。

$ fred-admin --price_add --operation='CreateDomain' --zone_fqdn=example    --operation_price 150 --period 1
$ fred-admin --price_add --operation='RenewDomain' --zone_fqdn=example    --operation_price 200 --period 1
$ fred-admin --price_add --operation='GeneralEppOperation'    --zone_fqdn=example    --operation_price 0.05 --period 1 --enable_postpaid_operation

ドメインを登録してみる

さて、セットアップを一通り終えましたので実際にドメインを登録してみたいと思います。登録するドメインは、nic.example とします。
レジストラアカウントは、system registrar を使用します。 登録の前に、登録対象のドメイン nic.example をwhoisで引いてみます。

$ whois -h localhost nic.example
% Domain Information over Whois protocol
%
% Whoisd Server Version: 3.10.2

%ERROR:101: no entries found
%
% No entries found.

ドメインを登録するには、fred-clientコマンドを使用します。
fred-clientが使用する認証情報については、REG-SYSアカウントのもので適当に設定する必要があります。 設定ファイルは、/etc/fred/fred-client.confです。

$ fred-client
FredClient upstream/2.10.1-132-gad39
Type "help", "license" or "credits" for more information.

Using configuration from /etc/fred/fred-client.conf
Connecting to localhost, port 700 ...
Connected!

REG-SYS@localhost> check_contact ID99
ID99:                     Available. Not in registry: Object is available.
REG-SYS@localhost> create_contact ID99 'Nanashi no Gombei' nanashi.gombei@nic.example 'Example Street' ExampleCity 12300 JP
Do you really want to send this command to the server? (y/N): y
Contact ID:               ID99
Created on:               2018-06-25T02:49:00+09:00
REG-SYS@localhost> check_contact ID99
ID99:                     Not available. Registered already
REG-SYS@localhost> info_contact ID99
Contact ID:               ID99
Repository object ID:     C0000000001-EPP
Created by:               REG-SYS
Designated registrar:     REG-SYS
Created on:               2018-06-25T02:49:00+09:00
Name:                     Nanashi no Gombei
Street:                   Example Street
City:                     ExampleCity
Postal code:              12300
Country code:             JP
Password for transfer:    NWmUd5vp
Email:                    nanashi.gombei@nic.example
Status:                   ok - Object is without restrictions
Disclose:                 voice
                          fax
                          email
                          vat
                          ident
                          notify_email
Hide:                     addr
REG-SYS@localhost> !create_nsset
Interactive input mode started. Press Ctrl+C to abort or Ctrl+D to finish command.
NSSET ID [required]: ID99
LIST of DNS[1/9] / Name server [required]: ns1.nic.example
LIST of DNS[1/9] / Server address[1/oo] [optional]: 127.0.0.1
LIST of DNS[1/9] / Server address[2/oo] [optional]:
LIST of DNS[2/9] / Name server [required]: ns2.nic.example
LIST of DNS[2/9] / Server address[1/oo] [optional]: 127.0.0.1
LIST of DNS[2/9] / Server address[2/oo] [optional]:
LIST of DNS[3/9] / Name server [optional]:
Technical contact[1/oo] [required]: ID99
Technical contact[2/oo] [optional]:
Password required by server to authorize the transfer [optional]: test
Report range level (0 - 10; higher = more detailed) [optional]:
Client transaction ID [optional]:

Interactive input completed. [Press Enter]
Command to issue:
create_nsset ID99 ((ns1.nic.example 127.0.0.1), (ns2.nic.example 127.0.0.1)) ID99 test
Do you really want to send this command to the server? (y/N): y
NSSET ID:                 ID99
Created on:               2018-06-25T02:52:20+09:00
REG-SYS@localhost> info_nsset ID99
NSSET ID:                 ID99
Repository object ID:     N0000000002-EPP
Created by:               REG-SYS
Designated registrar:     REG-SYS
Created on:               2018-06-25T02:52:20+09:00
Password for transfer:    test
Status:                   ok - Object is without restrictions
Technical contact:        ID99
Name servers:             ns1.nic.example, (127.0.0.1)
                          ns2.nic.example, (127.0.0.1)
Report level:             3
REG-SYS@localhost> create_domain nic.example ID99 NULL ID99
Do you really want to send this command to the server? (y/N): y
Domain name:              nic.example
Created on:               2018-06-25T02:53:18+09:00
Expiration date:          2019-06-24
REG-SYS@localhost> quit
Logout command sent to server

History IOError: [Errno 13] Permission denied
Ending session at localhost
Disconnected.

無事登録できたので、whoisとRDAPを引いてみます。

$ whois -h localhost nic.example
% Domain Information over Whois protocol
%
% Whoisd Server Version: 3.10.2
% Timestamp: Sun Jun 24 17:54:56 2018

domain:       nic.example
registrant:   ID99
nsset:        ID99
registrar:    REG-SYS
registered:   25.06.2018 02:53:18
expire:       24.06.2019

contact:      ID99
name:         Nanashi no Gombei
address:      Example Street
address:      ExampleCity
address:      12300
address:      JP
registrar:    REG-SYS
created:      25.06.2018 02:49:00

nsset:        ID99
nserver:      ns1.nic.example (127.0.0.1)
nserver:      ns2.nic.example (127.0.0.1)
tech-c:       ID99
registrar:    REG-SYS
created:      25.06.2018 02:52:20

RDAPのアクセス先は、http://localhost/rdap/domain/nic.example となります。

{
    "status": [
        "active"
    ],
    "fred_nsset": {
        "nameservers": [
            {
                "ipAddresses": {
                    "v4": [
                        "127.0.0.1"
                    ]
                },
                "objectClassName": "nameserver",
                "handle": "ns1.nic.example",
                "links": [
                    {
                        "href": "http://localhost/rdap/nameserver/ns1.nic.example",
                        "type": "application/rdap+json",
                        "rel": "self",
                        "value": "http://localhost/rdap/nameserver/ns1.nic.example"
~~~長いので省略~~~

肝心な example ゾーンのゾーンファイルですが、
/etc/fred/genzone.confのzonedirに指定したディレクトリにゾーンファイルが作られています。

$ cat /etc/bind/db.example
 18000 ;default TTL for all records in zone
example.                IN      SOA     a.dns.example.  hostmaster.nic.example. (1529832016 900 300 604800 900)
                IN      NS      a.dns.example.
a.dns.example.  IN      A       127.0.0.1
;
;--- domain records ---
;
nic.example.    IN      NS      ns1.nic.example.
ns1.nic.example.        IN      A       127.0.0.1
nic.example.    IN      NS      ns2.nic.example.
ns2.nic.example.        IN      A       127.0.0.1

最後に、レジストラへの課金情報ですが、 レジストリオペレータ向けのWebインターフェース(WebAdmin)が localhost:18456 にて動いているようで
そこから invoiceの情報をレジストラごとに見れそうでした。
今回は、system registrar によってドメインを登録したせいなのかわかりませんが、 特に請求情報を見つけられませんでした。

WebAdminについては、今後詳しく見ていこうと思います。

特定の認証局で発行された証明書の一覧を取得する(crt.shの使い方)

はじめに

CT(Certificate Transperency)の仕組みにより、認証局がどのような証明書を発行したかという情報は調べることができます。
crt.sh というツールを使用して、特定の認証局で発行された証明書の一覧を検索してみたいと思います。

crt.sh

認証局を選ぶ

私の環境でデフォルトでインストールされているルート証明書の中から、
適当な認証局を選びます。例えば、国内のルート認証局であるセコムにしてみます。

$ ls /usr/share/ca-certificates/mozilla/ | grep Security
Security_Communication_EV_RootCA1.crt
Security_Communication_RootCA2.crt
Security_Communication_Root_CA.crt

Security_Communication_RootCA2.crt の中身はこんな感じです。

$ cat Security_Communication_RootCA2.crt | openssl x509 -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 0 (0x0)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=JP, O=SECOM Trust Systems CO.,LTD., OU=Security Communication RootCA2
        Validity
            Not Before: May 29 05:00:39 2009 GMT
            Not After : May 29 05:00:39 2029 GMT
        Subject: C=JP, O=SECOM Trust Systems CO.,LTD., OU=Security Communication RootCA2
        Subject Public Key Info:
       以下略

IssuerとSubjectが同じ値になっていますので、ルート証明書であることがわかります。
こいつがルートとなっている(中間)証明書にはどんなものがあるのか検索してみます。

crt.shで証明書を検索する

crt.shのトップページから、「Advanced」 のリンクを選択します。 すると以下の様な感じの画面になるので、「Select search Type」から 「organizationUnitName」を選択してOUの値で検索します。 OUの値として、「Security Communication RootCA2」を入力します。

f:id:zkat:20181029193852j:plain

以下の表のような結果が返るので上の行のIssuer Nameの列をクリックします。

crt.sh ID Logged At Not Before Not After Issuer Name
1176879 2015-08-20 2009-05-29 2029-05-29 C=JP, O="SECOM Trust Systems CO.,LTD.", OU=Security Communication RootCA2
6986985 2015-08-20 2015-03-24 2023-09-29 C=JP, O=SECOM Trust.net, OU=Security Communication RootCA1

すると、一番下の行のChild CAsに、Security Communication RootCA2をルートとする中間認証局の一覧が表示されます。

Child CAs
C=JP, L=Academe, O=National Institute of Informatics, CN=NII Open Domain CA - G4
C=JP, L=Academe, O=National Institute of Informatics, CN=NII Open Domain Code Signing CA - G2
C=JP, L=Academe, O=National Institute of Informatics, CN=NII Open Domain S/MIME CA
C=JP, O=CrossTrust, CN=CrossTrust DV CA3
C=JP, O=CrossTrust, CN=CrossTrust DV CA4
C=JP, O=CrossTrust, CN=CrossTrust OV CA3
C=JP, O=CrossTrust, CN=CrossTrust OV CA4
C=JP, O="FreeBit Co.,Ltd.", CN=YourNet SSL for business2
C=JP, O="FreeBit Co.,Ltd.", CN=YourNet SSL for domain2
C=JP, O=FUJIFILM, CN=FUJIFILM Fnet CA - C
C=JP, O=FUJIFILM, CN=FUJIFILM Fnet CA - S
C=JP, O=FUJIFILM, CN=FUJIFILM Fnet CA - S2
C=JP, O=Fuji Xerox, CN=Fuji Xerox Certification Authority - G2
C=JP, O=Fuji Xerox, CN=Fuji Xerox Product CA 2 - S
C=JP, O=Fuji Xerox, CN=Fuji Xerox Product CA - S
C=JP, O=Fuji Xerox, CN=Fuji Xerox Xnet CA - C
C=JP, O=Fuji Xerox, CN=Fuji Xerox Xnet CA - S
C=JP, O=Fuji Xerox, CN=Fuji Xerox Xnet CA - S2
C=JP, O=INTEC INC., CN=EINS/PKI Public Certification Authority V3
C=JP, O=INTEC INC., CN=EINS/PKI Public Certification Authority V3
C=JP, O=Japanese Government, OU=Ministry of Defense, CN=Certification Authority
C=JP, O="Japan Registry Services Co., Ltd.", CN=JPRS Domain Validation Authority - G1
C=JP, O="Japan Registry Services Co., Ltd.", CN=JPRS Domain Validation Authority - G2
C=JP, O="Japan Registry Services Co., Ltd.", CN=JPRS Organization Validation Authority - G1
C=JP, O="Japan Registry Services Co., Ltd.", CN=JPRS Organization Validation Authority - G2
C=JP, O=KDDI Web Communications Inc., CN=KDDI Web Communications Certification Authority
C=JP, O=KDDI Web Communications Inc., CN=KDDI Web Communications Certification Authority 2
C=JP, O=National Institute of Informatics, CN=NII Open Domain CA - G5
C=JP, O="Nijimo, Inc.", CN=FujiSSL Public Certification Authority - G1
C=JP, O="Nijimo, Inc.", CN=FujiSSL Public Certification Authority - G2
C=JP, O="SECOM Trust Systems CO.,LTD.", CN=SECOM Passport for Web EV 2.0 CA
C=JP, O="SECOM Trust Systems CO.,LTD.", CN=SECOM Passport for Web MH CA
C=JP, O="SECOM Trust Systems CO.,LTD.", CN=SECOM Passport for Web SR 3.0 CA
C=JP, O="SECOM Trust Systems CO.,LTD.", CN=SECOM Passport for Web SR 3.0 CA
C=JP, O="SECOM Trust Systems CO.,LTD.", CN=SECOM TimeStamping CA2
C=JP, O="SECOM Trust Systems CO.,LTD.", CN=SubordinateCA6
C=JP, O="SECOM Trust Systems CO.,LTD.", OU=SECOM Passport for Member 2.0 PUB, CN=SECOM Passport for Member PUB CA4
C=JP, O="SECOM Trust Systems CO.,LTD.", OU=SECOM Passport for Member 2.0 PUB, CN=SECOM Passport for Member PUB CA5
C=JP, O="SECOM Trust Systems CO.,LTD.", OU=SECOM Passport for Member 2.0 PUB, CN=SECOM Passport for Member PUB CA6
C=JP, O="SECOM Trust Systems CO.,LTD.", OU=SECOM Passport for Member 2.0 PUB, CN=SECOM Passport for Member PUB CA7
C=JP, O="SECOM Trust Systems CO.,LTD.", OU=SECOM Passport for Member 2.0 PUB, CN=SECOM Passport for Member PUB CA8
C=JP, O=Sumitomo Mitsui Banking Corporation, OU=SMBC Authority, CN=SMBC Certificate Authority CA2
C=JP, O=XiPS, CN=XiPS CA2

リスト中の気になる中間認証局を適当にクリックします。
ここでは、C=JP, O=National Institute of Informatics, CN=NII Open Domain CA - G5にします。

Issued Certificates の行にEnter search termという検索窓があるので、%.go.jpなど適当に検索をすると、
この中間認証局で発行された go.jpドメインに対するすべての証明書 を確認することができます。

Common Lisp からRDAPつかってみる

はじめに

RDAP(Registration Data Access Protocol)をCommon Lispから使ってみます。

RDAP(Registration Data Access Protocol)とは

RDAPは、Whoisに代わるドメインIPアドレス等の登録情報を参照するためのプロトコルです。
Whoisの表示は、ドメインレジストリIPアドレスレジストリ毎に、異なるテキストフォーマットとなっていますが、 RDAPはJSONにて結果を取得可能です。

まだまだ、あまり普及はしておらず、現時点でRDAPの問い合わせに対応しているTLDは 下記の通り7ドメインです。

https://data.iana.org/rdap/dns.json

Common Lispから問い合わせてみる

RDAPの問い合わせは、HTTP(s)にて行うので、drakmaを使えば簡単です。
drakma、cl-json、babelをつかってます。

試しに適当なIPアドレスの登録情報を問い合わせてみます。

* (rdap-request "https://rdap.apnic.net/ip/192.41.192.129")

((:RDAP-CONFORMANCE "history_version_0" "rdap_level_0")
 (:NOTICES
  ((:TITLE . "Source")
   (:DESCRIPTION "Objects returned came from source" "APNIC"))
  ((:TITLE . "Terms and Conditions")
   (:DESCRIPTION
    "This is the APNIC WHOIS Database query service. The objects are in RDAP format.")
   (:LINKS
    ((:VALUE . "https://rdap.apnic.net/ip/192.41.192.129")
     (:REL . "terms-of-service")
     (:HREF . "http://www.apnic.net/db/dbcopyright.html")
     (:TYPE . "text/html")))))
 (:COUNTRY . "JP")
 (:EVENTS
  ((:EVENT-ACTION . "last changed") (:EVENT-DATE . "2017-10-18T10:40:02Z")))
 (:NAME . "JPNICNET")
 (:REMARKS
  ((:DESCRIPTION "Japan Network Information Center" "Urbannet-Kanda Bldg 4F"
    "3-6-2 Uchi-Kanda" "Chiyoda-ku, Tokyo 101-0047, Japan")
   (:TITLE . "description"))
  ((:DESCRIPTION
    "Email address for spam or abuse complaints : hostmaster@nic.ad.jp")
   (:TITLE . "remarks")))
 (:TYPE . "ASSIGNED PORTABLE") (:END-ADDRESS . "192.41.192.255")
 (:IP-VERSION . "v4") (:START-ADDRESS . "192.41.192.0")
 (:HANDLE . "192.41.192.0 - 192.41.192.255")
 (:OBJECT-CLASS-NAME . "ip network")
 (:LINKS
  ((:VALUE . "https://rdap.apnic.net/ip/192.41.192.129") (:REL . "self")
   (:HREF . "https://rdap.apnic.net/ip/192.41.192.0/24")
   (:TYPE . "application/rdap+json")))
 (:ENTITIES
  ((:ROLES "technical")
   (:EVENTS
    ((:EVENT-ACTION . "last changed") (:EVENT-DATE . "2012-08-28T08:00:01Z")))
   (:VCARD-ARRAY "vcard"
    (("version" NIL "text" "4.0") ("fn" NIL "text" "JPNIC Engineering Group")
     ("kind" NIL "text" "individual")
     ("adr"
      ((:LABEL . "Urbannet-Kanda Bldg 4F
3-6-2 Uchi-Kanda
Chiyoda-ku, Tokyo 101-0047,Japan"))
      "text" ("" "" "" "" "" "" ""))
     ("tel" ((:TYPE . "voice")) "text" "+81-3-5297-2311")
     ("tel" ((:TYPE . "fax")) "text" "+81-3-5297-2312")
     ("email" NIL "text" "hostmaster@nic.ad.jp")))
   (:HANDLE . "JE53-AP") (:OBJECT-CLASS-NAME . "entity")
   (:LINKS
    ((:VALUE . "https://rdap.apnic.net/ip/192.41.192.129") (:REL . "self")
     (:HREF . "https://rdap.apnic.net/entity/JE53-AP")
     (:TYPE . "application/rdap+json"))))
  ((:ROLES "administrative")
   (:EVENTS
    ((:EVENT-ACTION . "last changed") (:EVENT-DATE . "2012-08-28T08:00:04Z")))
   (:VCARD-ARRAY "vcard"
    (("version" NIL "text" "4.0") ("fn" NIL "text" "JPNIC IP Department")
     ("kind" NIL "text" "individual")
     ("adr"
      ((:LABEL . "Urbannet-Kanda Bldg 4F
3-6-2 Uchi-Kanda
Chiyoda-ku, Tokyo 101-0047,Japan"))
      "text" ("" "" "" "" "" "" ""))
     ("tel" ((:TYPE . "voice")) "text" "+81-3-5297-2311")
     ("tel" ((:TYPE . "fax")) "text" "+81-3-5297-2312")
     ("email" NIL "text" "hostmaster@nic.ad.jp")))
   (:HANDLE . "JI13-AP") (:OBJECT-CLASS-NAME . "entity")
   (:LINKS
    ((:VALUE . "https://rdap.apnic.net/ip/192.41.192.129") (:REL . "self")
     (:HREF . "https://rdap.apnic.net/entity/JI13-AP")
     (:TYPE . "application/rdap+json"))))
  ((:ROLES "abuse")
   (:EVENTS
    ((:EVENT-ACTION . "last changed") (:EVENT-DATE . "2017-10-18T10:21:54Z")))
   (:VCARD-ARRAY "vcard"
    (("version" NIL "text" "4.0") ("fn" NIL "text" "IRT-JPNIC-JP")
     ("kind" NIL "text" "group")
     ("adr"
      ((:LABEL . "Urbannet-Kanda Bldg 4F, 3-6-2 Uchi-Kanda
Chiyoda-ku, Tokyo 101-0047, Japan"))
      "text" ("" "" "" "" "" "" ""))
     ("email" NIL "text" "hostmaster@nic.ad.jp")
     ("email" ((:PREF . "1")) "text" "hostmaster@nic.ad.jp")))
   (:HANDLE . "IRT-JPNIC-JP") (:OBJECT-CLASS-NAME . "entity")
   (:LINKS
    ((:VALUE . "https://rdap.apnic.net/ip/192.41.192.129") (:REL . "self")
     (:HREF . "https://rdap.apnic.net/entity/IRT-JPNIC-JP")
     (:TYPE . "application/rdap+json")))))
 (:PORT-43 . "whois.apnic.net"))

opensslコマンドで特定の暗号スイートを使用する

はじめに

openssl s_client で connect するときに cipher suites を指定してアクセスする方法をめもします。

使用可能なcipherを取得

下記コマンドにて一覧を取得できます

$ openssl ciphers | sed -e "s/:/\n/g" | sort
AES128-GCM-SHA256
AES128-SHA
AES128-SHA256
AES256-GCM-SHA384
AES256-SHA
AES256-SHA256
CAMELLIA128-SHA
CAMELLIA256-SHA
DES-CBC3-SHA
DH-DSS-AES128-GCM-SHA256
DH-DSS-AES128-SHA
DH-DSS-AES128-SHA256
DH-DSS-AES256-GCM-SHA384
DH-DSS-AES256-SHA
DH-DSS-AES256-SHA256
DH-DSS-CAMELLIA128-SHA
DH-DSS-CAMELLIA256-SHA
DH-DSS-DES-CBC3-SHA
DH-DSS-SEED-SHA
DHE-DSS-AES128-GCM-SHA256
DHE-DSS-AES128-SHA
DHE-DSS-AES128-SHA256
DHE-DSS-AES256-GCM-SHA384
DHE-DSS-AES256-SHA
DHE-DSS-AES256-SHA256
DHE-DSS-CAMELLIA128-SHA
DHE-DSS-CAMELLIA256-SHA
DHE-DSS-SEED-SHA
DHE-RSA-AES128-GCM-SHA256
DHE-RSA-AES128-SHA
DHE-RSA-AES128-SHA256
DHE-RSA-AES256-GCM-SHA384
DHE-RSA-AES256-SHA
DHE-RSA-AES256-SHA256
DHE-RSA-CAMELLIA128-SHA
DHE-RSA-CAMELLIA256-SHA
DHE-RSA-SEED-SHA
DH-RSA-AES128-GCM-SHA256
DH-RSA-AES128-SHA
DH-RSA-AES128-SHA256
DH-RSA-AES256-GCM-SHA384
DH-RSA-AES256-SHA
DH-RSA-AES256-SHA256
DH-RSA-CAMELLIA128-SHA
DH-RSA-CAMELLIA256-SHA
DH-RSA-DES-CBC3-SHA
DH-RSA-SEED-SHA
ECDH-ECDSA-AES128-GCM-SHA256
ECDH-ECDSA-AES128-SHA
ECDH-ECDSA-AES128-SHA256
ECDH-ECDSA-AES256-GCM-SHA384
ECDH-ECDSA-AES256-SHA
ECDH-ECDSA-AES256-SHA384
ECDH-ECDSA-DES-CBC3-SHA
ECDH-ECDSA-RC4-SHA
ECDHE-ECDSA-AES128-GCM-SHA256
ECDHE-ECDSA-AES128-SHA
ECDHE-ECDSA-AES128-SHA256
ECDHE-ECDSA-AES256-GCM-SHA384
ECDHE-ECDSA-AES256-SHA
ECDHE-ECDSA-AES256-SHA384
ECDHE-ECDSA-DES-CBC3-SHA
ECDHE-ECDSA-RC4-SHA
ECDHE-RSA-AES128-GCM-SHA256
ECDHE-RSA-AES128-SHA
ECDHE-RSA-AES128-SHA256
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-RSA-AES256-SHA
ECDHE-RSA-AES256-SHA384
ECDHE-RSA-DES-CBC3-SHA
ECDHE-RSA-RC4-SHA
ECDH-RSA-AES128-GCM-SHA256
ECDH-RSA-AES128-SHA
ECDH-RSA-AES128-SHA256
ECDH-RSA-AES256-GCM-SHA384
ECDH-RSA-AES256-SHA
ECDH-RSA-AES256-SHA384
ECDH-RSA-DES-CBC3-SHA
ECDH-RSA-RC4-SHA
EDH-DSS-DES-CBC3-SHA
EDH-RSA-DES-CBC3-SHA
IDEA-CBC-SHA
PSK-3DES-EDE-CBC-SHA
PSK-AES128-CBC-SHA
PSK-AES256-CBC-SHA
PSK-RC4-SHA
RC4-MD5
RC4-SHA
SEED-SHA
SRP-3DES-EDE-CBC-SHA
SRP-AES-128-CBC-SHA
SRP-AES-256-CBC-SHA
SRP-DSS-3DES-EDE-CBC-SHA
SRP-DSS-AES-128-CBC-SHA
SRP-DSS-AES-256-CBC-SHA
SRP-RSA-3DES-EDE-CBC-SHA
SRP-RSA-AES-128-CBC-SHA
SRP-RSA-AES-256-CBC-SHA

connect時に使用する

-cipher オプションに上記を与えると、それを使用してTLSネゴシエーションが行われるみたい です

$ openssl s_client -connect google.com:443 -servername google.com  -cipher ECDHE-RSA-AES256-GCM-SHA384 < /dev/null