#author("2019-09-16T17:03:03+09:00","","")
#contents()

** 考え方 [#icd86f00]
- クライアント証明には(自己認証局であっても)CA の裏付けが必要
- クライアント用の証明書の作成(発行)には認証局の証明書、鍵が必要
- クライアント証明書には &color(red){SSLCACertificateFile}; を追加で apache2 に指定する必要あり
- &color(red){SSLCACertificateFile = CA中間証明書 + root証明書};

- kgb.hmuna.com には第三者証明書が登録済み
-- サーバー証明書 [&color(blue){SSLCertificateFile};]
-- 秘密鍵 [&color(blue){SSLCertificateKeyFile};]
-- 中間証明書[&color(blue){SSLCertificateChainFile};]
 # Server Certificate:
 SSLCertificateFile       /etc/ssl/official4/kgb_hmuna_com.crt
 
 # Server Private Key:
 SSLCertificateKeyFile    /etc/ssl/official4/wiki.hmuna.com.privatekey
 
 # Server Certificate Chain:
 SSLCertificateChainFile  /etc/ssl/official4/kgb_hmuna_com.ca-bundle
 
 # Client Certificate: (official CA (COMODO) to generate client certificate)
 SSLCACertificateFile     /etc/ssl/official4A_for_client_certificate/COMODO_root.crt
 SSLVerifyClient         none

- だが CA局の証明書と鍵は無い
-- 認証局の証明書() =
-- 認証局の鍵 () =
- [[&color(red){登録済みの公式 &color(red){クライアント証明から}; 認証局の中間証明書、root証明書を取得する方法};:https://rms.ne.jp/howto/basis/apache_client_cert.html#get_pem]]
-- 使えない、まだクライアント証明が入っていないのだから

- SSLCertificateChainFile と SSLCACertificateFile の違い
-- SSLCertificateChainFile ディレクティブ:サーバー証明書における中間証明書のパスを設定 
--- &color(red){Apache2.4.8以降はSSLCertificateChainFileディレクティブはない}; ----- のでコメントアウトしても OK だった
-- SSLCACertificateFile ディレクティブ:クライアント証明書における中間証明書のパスを指定

*** openssl バージョンの確認 [#b5a07749]
 munakata@mvc:~$ openssl version -a
 
 OpenSSL 1.1.1  11 Sep 2018
 built on: Thu Jun 20 17:36:28 2019 UTC
 platform: debian-amd64
 
 options:  bn(64,64) rc4(8x,int) des(int) blowfish(ptr)
 compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -Wa,--noexecstack -g -O2 -fdebug-prefix-map=/build/openssl-cn9tZy/openssl-1.1.1=. 
 -fstack-protector-strong -Wformat -Werror=format-security -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ - 
 DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM 
 -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPADLOCK_ASM -DPOLY1305_ASM -DNDEBUG - 
 
 Wdate-time -D_FORTIFY_SOURCE=2
 OPENSSLDIR: "/usr/lib/ssl"
 ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-1.1"
 Seeding source: os-specific

*** Apache バージョン確認 [#l740b5ac]
 munakata@mvc:~$ apache2 -v
 Server version: Apache/2.4.29 (Ubuntu)
 Server built:   2019-08-26T13:41:23

- [[Apache 2.4.8 から中間CA証明書を指定するSSLCertificateChainFile ディレクティブが廃止されました。中間CA証明書、およびクロスルート証明書(オプション)はサーバ証明書と一つの証明書ファイルとしてまとめて、SSLCertificateFileディレクティブに指定してください。(digicert の説明):https://knowledge.digicert.com/ja/jp/solution/SO23415.html]]

*** Apache mod-ssl の確認 [#t5a30443]
 munakata@mvc:~$ sudo apache2ctl -M | grep ssl
  ssl_module (shared)

 munakata@mvc:~$ cat /etc/apache2/mods-available/ssl.load
 # Depends: setenvif mime socache_shmcb
 LoadModule ssl_module /usr/lib/apache2/modules/mod_ssl.so

 munakata@mvc:~$ file /usr/lib/apache2/modules/mod_ssl.so
 /usr/lib/apache2/modules/mod_ssl.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=683bb4e55c962655e5267000caad85252a63bfa3, stripped

*** kgb.hmuna.com 証明書情報 [#g2979cc5]
- COMODO により発行されているもの
- &ref(kgb_cirt.jpg);

*** COMODO の SSLCACertificateFile 対応 [#d8921c69]
- [[SSLCACertificateFileディレクティブの代替ディレクティブはありますか?:https://jp.comodo.com/ssl-certificate-support/server_faq/ssl-server-certificate-apache.html]]
-- &color(red){SSLCACertificateFileの代わりにSSLCertificateChainFileを使用できます};が、Apple MACでは証明書の信頼性に関するエラーを表示することがあり、中間証明書をチェックしていない可能性があります。

** クライアント証明書の作成 [#o285d5a9]

*** クライアント証明書の作成に必要な情報、操作などから方針を決定 [#p0954d00]
- クライアント鍵(key)の作成(自己完結) 
 openssl genrsa -des3 -out example_com-client1.key 1024

- 証明書への署名要求(csr)の作成(自己完結)
 openssl req -new -sha256 -key example_com-client1.key -out example_com-client1.csr

- openssl.cnf を一部変更した openssl-client.cnf を作成(自己完結)
 [my_ca_default]
 .
 .
 x509_extensions = usr_cert     # 追加
 .
 .
 [ usr_cert ]                                      # 追加
 basicConstraints=CA:FALSE         # 追加
 nsCertType = client, email            # 追加

- 作成した openssl-client.cnf を使用して CAで署名(&color(red){CA局の情報が必要};)
 sudo openssl ca -config ./openssl-client.cnf -md sha256 -cert myCA/myca.crt -keyfile myCA/private/myca.key -out example_com-client1.crt -in example_com-client1.csr
-- openssl-client.cnf(自己完結)
-- &color(red){myCA/myca.crt(CA局の情報が必要 crt ファイルは既にある?)};
---  &color(red){''違う! 既にあるのはサーバー証明書。 CA局の証明書は別に指定できる、つまり自己認証CA局を併存させる事ができるはず''};
-- myca.key(既に自分で作った秘密鍵がある ・・・ だから自己完結?)
-- example_com-client1.crt(生成するクライアント証明書)
-- example_com-client1.csr(自己完結)

*** オレオレ CA を使ったクライアント証明書の作成 [#x63d13fa]
- [[[Apache+openSSLでクライアント認証 - 闘うITエンジニアの覚え書き]:https://www.magata.net/memo/index.php?Apache%2BopenSSL%A4%C7%A5%AF%A5%E9%A5%A4%A5%A2%A5%F3%A5%C8%C7%A7%BE%DA]] をほぼそのままフォローする形

- /etc/ssl/private_CA にファイルを生成していく
 munakata@mvc:/etc/ssl$ sudo mkdir private_CA
 munakata@mvc:/etc/ssl$ cd private_CA
 
 munakata@mvc:/etc/ssl/private_CA$ sudo mkdir private
 munakata@mvc:/etc/ssl/private_CA$ sudo mkdir newcerts
 munakata@mvc:/etc/ssl/private_CA$ sudo chmod 700 private/
 munakata@mvc:/etc/ssl/private_CA$ sudo sh -c 'echo 01>serial'
 
 munakata@mvc:/etc/ssl/private_CA$ cat serial
 0
 
 munakata@mvc:/etc/ssl/private_CA$ sudo touch index.txt
 
 munakata@mvc:/etc/ssl/private_CA$ ls -l
 合計 12
 -rw-r--r-- 1 root root    0  9月 16 15:08 index.txt
 drwxr-xr-x 2 root root 4096  9月 16 15:02 newcerts
 drwx------ 2 root root 4096  9月 16 15:02 private
 -rw-r--r-- 1 root root    3  9月 16 15:04 serial

- 自己認証 CA 局を作成
 munakata@mvc:/etc/ssl/private_CA$ sudo openssl req -new -x509 -newkey rsa:2048 -out myca.crt -keyout private/myca.key -days 3650 -sha256
 Generating a RSA private key
 ..........+++++
 ........................+++++
 writing new private key to 'private/myca.key'
 Enter PEM pass phrase:  <----------------- bobbob274mocha
 Verifying - Enter PEM pass phrase:
 -----
 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) [JP]:JP
 State or Province Name (full name) [Kanagawa]:Kanagawa
 Locality Name (eg, city) []:Yokohama
 Organization Name (eg, company) [Internet Widgits Pty Ltd]:hmuna
 Organizational Unit Name (eg, section) []:IT
 Common Name (e.g. server FQDN or YOUR name) []:kgb.hmuna.com
 Email Address []:

-- 有効期間は 10年 とした
-- &color(red){パスフレーズは bobbob274mocha};

- openssl.cnf ファイルをクライアント証明書用に編集
-- &ref(client_openssl.cnf);

- クライアント証明書鍵の発行
 munakata@mvc:/etc/ssl/private_CA$ sudo openssl genrsa -des3 -out kgb_hmuna-client1.key 1024
 Generating RSA private key, 1024 bit long modulus (2 primes)
 ....................................................................+++++
 ......+++++
 e is 65537 (0x010001)
 Enter pass phrase for kgb_hmuna-client1.key:
 Verifying - Enter pass phrase for kgb_hmuna-client1.key:
-- &color(red){パスフレーズは magumagu274}; 

- 証明書への署名要求の作成
 munakata@mvc:/etc/ssl/private_CA$ sudo openssl req -new -sha256 -key kgb_hmuna-client1.key -out kgb_hmuna-client1.csr
 Enter pass phrase for kgb_hmuna-client1.key: <---------- magumagu274
 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) [JP]:
 State or Province Name (full name) [Kanagawa]:
 Locality Name (eg, city) []:Yokohama
 Organization Name (eg, company) [Internet Widgits Pty Ltd]:hmuna
 Organizational Unit Name (eg, section) []:IT
 Common Name (e.g. server FQDN or YOUR name) []:kgb.hmuna.com
 Email Address []:
 
 Please enter the following 'extra' attributes
 to be sent with your certificate request
 A challenge password []:  <------------------ そのままリターン
 An optional company name []:

- クライアント証明書の発行
 munakata@mvc:/etc/ssl/private_CA$ sudo sh -c 'openssl ca -config ./client_openssl.cnf -md sha256 -cert ./myca.crt -keyfile ./private/myca.key -out kgb_hmuna-client1.crt -in kgb_hmuna-client1.csr'
 Using configuration from ./client_openssl.cnf
 Enter pass phrase for ./private/myca.key:
 Can't open ./index.txt.attr for reading, No such file or directory
 139890709250496:error:02001002:system library:fopen:No such file or directory:../crypto/bio/bss_file.c:72:fopen('./index.txt.attr','r')
 139890709250496:error:2006D080:BIO routines:BIO_new_file:no such file:../crypto/bio/bss_file.c:79:
 Check that the request matches the signature
 Signature ok
 Certificate Details:
         Serial Number: 1 (0x1)
         Validity
             Not Before: Sep 16 07:26:53 2019 GMT
             Not After : Sep 13 07:26:53 2029 GMT
         Subject:
             countryName               = JP
             stateOrProvinceName       = Kanagawa
             organizationName          = hmuna
             organizationalUnitName    = IT
             commonName                = kgb.hmuna.com
         X509v3 extensions:
             Netscape Cert Type:
                 SSL Client, S/MIME
             X509v3 Basic Constraints:
                 CA:FALSE
             Netscape Comment:
                 OpenSSL Generated Certificate
             X509v3 Subject Key Identifier:
                 58:AB:C3:DC:9D:50:59:15:A6:42:2E:68:C7:8A:F5:23:F2:CD:7E:B5
             X509v3 Authority Key Identifier:
                 keyid:D9:E6:21:6D:2C:03:EE:80:7E:44:85:10:2A:D1:DF:F9:7E:0F:BA:A8
 
 Certificate is to be certified until Sep 13 07:26:53 2029 GMT (3650 days)
 Sign the certificate? [y/n]:y
 
 1 out of 1 certificate requests certified, commit? [y/n]y
 Write out database with 1 new entries
 Data Base Updated

- ファイルの状態
 munakata@mvc:/etc/ssl/private_CA$ sudo tree
 .
 ├── client_openssl.cnf
 ├── crl
 ├── index.txt
 ├── index.txt.attr
 ├── index.txt.old
 ├── kgb_hmuna-client1.crt <--- CA 局の証明書:これを Apache に登録する
 ├── kgb_hmuna-client1.csr
 ├── kgb_hmuna-client1.key
 ├── myca.crt
 ├── newcerts
 │   └── 01.pem <-------------- 生成されたクライアント証明書
 ├── private
 │   └── myca.key <----------- CA 局の鍵ファイル
 ├── serial
 └── serial.old
-- CA 局の証明書 = &ref(kgb_hmuna-client1.crt);

- クライアント証明書を PKCS#12 形式に変換
 munakata@mvc:/etc/ssl/private_CA$ sudo openssl pkcs12 -export -in kgb_hmuna-client1.crt -inkey kgb_hmuna-client1.key -out kgb_hmuna-client1.p12
 Enter pass phrase for kgb_hmuna-client1.key:
 Enter Export Password:  <---------------- magumagu274
 Verifying - Enter Export Password: <----- magumagunanamocha
-- &color(red){export password = magumagunanamocha};
-- &ref(kgb_hmuna-client1.p12);


** 補足情報 [#w8a6747e]
*** 参考 URL [#cdbc3578]
- CA 局作成関連
-- [[Ubuntu 18.04 LTS で OpenSSL を使ったプライベート認証局&証明書を作る:https://kgb.hmuna.com/index.php?cmd=edit&page=HomeServer17B]]
-- [[https://server-setting.info/centos/private-ca-cert.html:https://server-setting.info/centos/private-ca-cert.html]]
-- [[OpenSSLで自己認証局を作る:https://kgb.hmuna.com/index.php?cmd=edit&page=HomeServer17B]]
- クライアント証明書関連
-- [[☆ Apache+openSSLでクライアント認証:https://www.magata.net/memo/index.php?Apache%2BopenSSL%A4%C7%A5%AF%A5%E9%A5%A4%A5%A2%A5%F3%A5%C8%C7%A7%BE%DA]]
-- [[クライアント証明書を要求するサイトの構築(Apache+OpenSSL)その1:https://qiita.com/tukiyo3/items/b5e8b3efce800b0fd269]]
-- [[Apacheでのクライアント証明書利用設定入門:https://rms.ne.jp/howto/basis/apache_client_cert.html]]
-- [[Client Authentication and Access Control (mod_ssl マニュアル):http://www.modssl.org/docs/2.8/ssl_howto.html#ToC6]]
- 一般
-- [[RSA鍵、証明書のファイルフォーマットについて:https://qiita.com/kunichiko/items/12cbccaadcbf41c72735]]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS