今回は「署名リクエスト(CSR)」についてです。
1. 署名リクエスト – CSR (Certificate Signing Request)
CSRというのは「自身(個人でも組織でも)の住所・名前・メールアドレスなどの情報を、公開鍵暗号の秘密鍵と紐つけて作ったデータ」です。「紐つける」というのは秘密鍵そのものを込めることではなく、生成されたデータにその秘密鍵とペアとなる公開鍵を込める作業になります。
CSRはウェブサイトの暗号化通信を実装する際に必要な「サーバー証明書」を発行してもらう際にも必要です。実際にCSRを生成する作業は下記の通りです。
<?php $privkey = '-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC7XZwu0amHHTix GRTHhGoj/tgfKVNH5ckWMozllYprKY7JNIHr7wvicLsSKTbbG0lzG9fqKZsmzhSI alazh5+MZZBKF8nFktS+4omyn3R7gHUSZWz2Mqbvv2BYEMdTnb6h5TjlD6SDCG8W 4obD9re9VZ1R8Oy7N21Cd3yTIYHBfm0EI3gA8RageIlbPHDW7fxwvYOfVzGTMqkJ qlNR51veldap+uizO/a9D+ZMOzjKIDDTyrawfU18PrHihi00e0DevbY/RFCn2G9A zEYdi78mb4yHbmfwj0PMm/GwuJUYclBYj0wkTYSx0RvX8ypbsJwTzE2nTuAcUFRT 8yOru4NfAgMBAAECggEBAKgxlTWWMpe+zJh2Cmg8XsenSr1WbJM7HHNXt5GU1yfx q2LFRufTtBh22AeqhbrU2O+DDCUBamzATEBVLTWGRtxSg99vUUqRz3b3h2KYr4j6 PJ3h/JlZyO+pHUSQ804Fag6M5bEChMy3snmZqh6aCEDnbQ0UuH4reGJVPrgZORDG 8Ae/5ZSdVsVO8Bxj2SykGjtPu1XnJU6OZCdyIPgZo0E9djmq0lfZAfwnHYkIdx34 hEs6m/63dFbffjmWjIzqeZxyvSQdOvi48XbfPmcjwLXWRGF8A5Bwf7v4dwNAGWgJ j7L6H3L0jGe4gDzSLksht+TrN6VUlUW80WeofNp6KMkCgYEA9mO2X2QYqeidGtSL ff/rxLhjF9bKW7A5wa0Ps8R4go3CkQil19ZFV4IbFiz1TWeMInp96ZQ8U8e6xGQV i6Ht3Byui9BQWLAjWPBDcBhyiJhYBsvjMOVO9Xcd+WijR6xG/nf1EuJK/0Ur/CDK zGlME/uAyT+QpllwBBY3MmbQZ1sCgYEAwqyGA/RB9E1X/Fn3mt1SR849u8TZbKXt WPqOUwJvufE74hPFUxAqUoAimsgOm4nY7xfu2AJjCLCqQB+JL43HVuqawNZk3Lkw xH2jdzaYdFWWo+k0yDF2AsPBwtjXop1U/qqoh4Sux8Yq8bKPjEnUpGcT1EuhuJUw ot1GrWvt100CgYEA8cbLETQyF5jRgaCL+WqGuxWM97mn/O0i3/Co9eiXsNTW1mc8 Bl6W0NY1Kj+XvwsbMkItCGaUBEp79XeYxNpzhIkIpt4V2dGN/hpWssrqqSuFRbYR DMwX/TuUSEfr4csmJ1MjRBKXMYN5NAIhvxCcvQcRS2p60SH2j6wVIfpOCv0CgYAN oN5Q8IydebyrIfE/mjbkZ//SYVmHTaZsED5eeVExBz5V+WRbCEquM+I4S8EaCnBx bI9/98rPFO8WRh7ogVhvMUVcMqYk/aH4X4NOGThbDJLbLrxPN4c3clTiOyP9cl48 5d2efx9tROZEvWdnPtPwHnc46YKM1YTuIeeMxH2GEQKBgFgbSbBUSUZrYMYG0Q1n y+70qB/N20hzJHe0a+qcNMayvkHSW0DSku4lZ+pr8sZF8RyCWmNgT+NswOV1KBsT AP7I4/sUfZBeTDdq9W+nQxhOdyJczkDdy90dYJ3QtF36aq388Cf92STXT6tzgHZS jUK0xGRLEcihn/MfiHON+1eu -----END PRIVATE KEY-----'; // CSR生成には不要だが、CSRに公開鍵が含まれることを確認するために $pubkey = '-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu12cLtGphx04sRkUx4Rq I/7YHylTR+XJFjKM5ZWKaymOyTSB6+8L4nC7Eik22xtJcxvX6imbJs4UiGpWs4ef jGWQShfJxZLUvuKJsp90e4B1EmVs9jKm779gWBDHU52+oeU45Q+kgwhvFuKGw/a3 vVWdUfDsuzdtQnd8kyGBwX5tBCN4APEWoHiJWzxw1u38cL2Dn1cxkzKpCapTUedb 3pXWqfroszv2vQ/mTDs4yiAw08q2sH1NfD6x4oYtNHtA3r22P0RQp9hvQMxGHYu/ Jm+Mh25n8I9DzJvxsLiVGHJQWI9MJE2EsdEb1/MqW7CcE8xNp07gHFBUU/Mjq7uD XwIDAQAB -----END PUBLIC KEY-----'; echo '公開鍵'; echo $pubkey; echo '
'; $dn = array( "countryName" => "JP", "stateOrProvinceName" => "Tokyo", "localityName" => "Minatoku", "organizationName" => "Test Limited", "organizationalUnitName" => "Test Team", "commonName" => "First Last", "emailAddress" => "First.Last@example.com" ); // 秘密鍵を使ってCSRを生成します(CSRには公開鍵が込められます)。 $csr = openssl_csr_new($dn, $privkey); echo '生成されたCSR(base64_encodeされた状態)
'; openssl_csr_export($csr, $csrout) and var_dump($csrout); echo '
'; echo 'CSRに込められた名前・住所・メールアドレスなどの情報
'; $csr_detail = openssl_csr_get_subject($csr); var_dump($csr_detail); echo '
'; echo 'CSRから抽出された公開鍵'; $csr_pubkey = openssl_csr_get_public_key($csr); $info = openssl_pkey_get_details($csr_pubkey); echo $info['key']; ?>
上記の実行結果は下記です。
公開鍵
-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu12cLtGphx04sRkUx4Rq I/7YHylTR+XJFjKM5ZWKaymOyTSB6+8L4nC7Eik22xtJcxvX6imbJs4UiGpWs4ef jGWQShfJxZLUvuKJsp90e4B1EmVs9jKm779gWBDHU52+oeU45Q+kgwhvFuKGw/a3 vVWdUfDsuzdtQnd8kyGBwX5tBCN4APEWoHiJWzxw1u38cL2Dn1cxkzKpCapTUedb 3pXWqfroszv2vQ/mTDs4yiAw08q2sH1NfD6x4oYtNHtA3r22P0RQp9hvQMxGHYu/ Jm+Mh25n8I9DzJvxsLiVGHJQWI9MJE2EsdEb1/MqW7CcE8xNp07gHFBUU/Mjq7uD XwIDAQAB -----END PUBLIC KEY-----
生成されたCSR(base64_encodeされた状態)
-----BEGIN CERTIFICATE REQUEST----- MIIC3TCCAcUCAQAwgZcxCzAJBgNVBAYTAkpQMQ4wDAYDVQQIDAVUb2t5bzERMA8G A1UEBwwITWluYXRva3UxFTATBgNVBAoMDFRlc3QgTGltaXRlZDESMBAGA1UECwwJ VGVzdCBUZWFtMRMwEQYDVQQDDApGaXJzdCBMYXN0MSUwIwYJKoZIhvcNAQkBFhZG aXJzdC5MYXN0QGV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAu12cLtGphx04sRkUx4RqI/7YHylTR+XJFjKM5ZWKaymOyTSB6+8L4nC7 Eik22xtJcxvX6imbJs4UiGpWs4efjGWQShfJxZLUvuKJsp90e4B1EmVs9jKm779g WBDHU52+oeU45Q+kgwhvFuKGw/a3vVWdUfDsuzdtQnd8kyGBwX5tBCN4APEWoHiJ Wzxw1u38cL2Dn1cxkzKpCapTUedb3pXWqfroszv2vQ/mTDs4yiAw08q2sH1NfD6x 4oYtNHtA3r22P0RQp9hvQMxGHYu/Jm+Mh25n8I9DzJvxsLiVGHJQWI9MJE2EsdEb 1/MqW7CcE8xNp07gHFBUU/Mjq7uDXwIDAQABoAAwDQYJKoZIhvcNAQEFBQADggEB ALOY0uNgBGO2SA4WAN9Qz6ZmJru3LansaiI4xuHhVTtffWcDSlINkIbvfOAEWDr6 2o0kk3X9Ga/18WPhE/6/zbwOMALZpcKNAE3kuZ4eEvTl2nNGKP7FpccEaT9Rri6T CNwNvPrkiH92y+zAIOgZdEna7SlxT/4WetSSdOH9wfK4Q2Q38AgTZuCyVHIERzU4 C8uGwj7NQK5OyvEdWzZOcvZ6elg+R6o81u1A0fXQ91NYIF5++/wyPIMxnqIlingN 2v8rZfOZ0MpkYvJhXmaJlmlm9gnGKmCp2SEcyAVzk0+EHPOccnk3d2AHi3JyHfww zTcP/OLsRFn4yiTKVtuCCN0= -----END CERTIFICATE REQUEST-----
CSRに込められた名前・住所・メールアドレスなどの情報
array(7) { ["C"]=> string(2) "JP" ["ST"]=> string(8) "Tokyo" ["L"]=> string(17) "Minatoku" ["O"]=> string(12) "Test Limited" ["OU"]=> string(9) "Test Team" ["CN"]=> string(10) "First Last" ["emailAddress"]=> string(22) "First.Last@example.com" }
CSRから抽出された公開鍵
-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu12cLtGphx04sRkUx4Rq I/7YHylTR+XJFjKM5ZWKaymOyTSB6+8L4nC7Eik22xtJcxvX6imbJs4UiGpWs4ef jGWQShfJxZLUvuKJsp90e4B1EmVs9jKm779gWBDHU52+oeU45Q+kgwhvFuKGw/a3 vVWdUfDsuzdtQnd8kyGBwX5tBCN4APEWoHiJWzxw1u38cL2Dn1cxkzKpCapTUedb 3pXWqfroszv2vQ/mTDs4yiAw08q2sH1NfD6x4oYtNHtA3r22P0RQp9hvQMxGHYu/ Jm+Mh25n8I9DzJvxsLiVGHJQWI9MJE2EsdEb1/MqW7CcE8xNp07gHFBUU/Mjq7uD XwIDAQAB -----END PUBLIC KEY-----
というように、CSRが生成されて名前・住所・メールアドレスなどや公開鍵が含まれていることがわかります。このCSRに対し、第三者が署名をすることで「この名前・住所・メールアドレスなどや公開鍵について私が確認しましたよ」と示す証明書(これがSSL/TLS通信でのサーバ証明書)となります。なお、CSRへの署名は第三者ではなく自分自身で行うことも可能(自己署名証明書 self-signed certificateと呼んで信用度の度合いは下げて扱われます)です。
ウェブサイトの暗号化通信は、サーバー証明書に含まれる公開鍵を使ってブラウザで情報を暗号化し、それを受け取ったサーバーは秘密鍵で復号するので、サーバーにはサーバ証明書内の公開鍵にひもついた秘密鍵を持っておくことになります。
CSRへの署名は別の署名(とそれに対応する秘密鍵)で行われます。こうして考えると署名した署名の署名は誰がするのだという無限ループに陥るように思うでしょう。結局は「Certificate Authority(CA)」と呼ばれる「認証局となる大御所(Verisignとか)」がおこなったかが署名の信用度を決めているのが実情です。
次回はようやく要約関数に言及します。