Crypto - Data Security - Digital Signature - Others - PHP

電子署名(署名リクエスト)

 今回は「署名リクエスト(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とか)」がおこなったかが署名の信用度を決めているのが実情です。


次回はようやく要約関数に言及します。

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments