您好,欢迎访问一九零五行业门户网

PHP如何使用OpenSSL加密中的证书操作

本篇文章给大家介绍一下php使用openssl加密中证书操作的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
关于对称和非对称的加密操作,我们已经学习完两篇文章的内容了,接下来,我们就继续学习关于证书的生成。
生成 csr 证书签名请求csr 是用于生成证书的签名请求,在 csr 中,我们需要一些 dn 信息。其实也就是当前这个证书的服务对象,包含公司名、邮箱之类的内容。
$privkey = openssl_pkey_new([ "private_key_bits" => 2048, "private_key_type" => openssl_keytype_rsa,]);$dn = [ "countryname" => "cn", // 国家 "stateorprovincename" => "hunan", // 省 "localityname" => "changsha", // 市 "organizationname" => "zyblog", // 公司单位名称 "organizationalunitname" => "zyblog", // 公司单位名称 "commonname" => "zyblog.xxx", // 公用名称,一般可以填域名 "emailaddress" => "zy@zyblog.xxx" // 邮箱地址];$csr = openssl_csr_new($dn, $privkey, ['digest_alg' => 'sha256']);openssl_csr_export($csr, $csr_string);var_dump($csr_string);// string(1102) "-----begin certificate request-----// miic9dccadwcaqawga4xczajbgnvbaytakdcmrewdwydvqqidahtb21lcnnlddeu// mbiga1uebwwlr2xhc3rvbmj1cnkxhzadbgnvbaomflrozsbccmfpbibsb29tiexp// bwl0zwqxhzadbgnvbasmflbiucbeb2n1bwvudgf0aw9uifrlyw0xfdasbgnvbamm// c1dleibgdxjsb25nmr4whayjkozihvcnaqkbfg93zxpazxhhbxbszs5jb20wggei// ma0gcsqgsib3dqebaquaa4ibdwawggekaoibaqch+kxdtr7+ymocjp+s77yjmbt2// aigtvnoy3ioj+jvp3vxcu9diehw4det/tbpmlpxvwpfhzf2vmpocznhnwfbv+6sz// tmphaloconshabh+5k5uvvrgfm7zv+0wts/8l/zxz/pl9wpb0bcpusxb2cjy+ckn// hm5ayc53phpoyu5zc1b+z96a7gsne+6a9qjsfrpakwir8qlx1ewpe23emy2yscsc// 6bqvkq1bfbuezim+pstwu0aqyasgsztetbbd4h4pho82bmffhhlwpwu3bztul8u1// 4jj2mbsk1f/g047eckphrhdo9zwp6mff5kpnr6oiwayzvw8k8cdazpfex863agmb// aaggadanbgkqhkig9w0baqsfaaocaqealfzb3jcc7dkt5ygphjsxct/qygcljl4v// rs1udhhsi49fuaujokovnushblmkrwawur5pmetf6kvyz8uzdiuxcswdf5ax8ctc// ury+3kgb3oswm/35ryikv2oi1lhlhgxaikdzvnl41woqnobfaypbtxwskcbpmw+1// kfesmmwpygyxx/zc1czhf2t7osphsayvdw5eqyhakn+onxfil22pqdzm1mm8xwhb// akpqzphgipjdudoi3o8csilri2bxwgcdtuh2ovioros8o6gammd7uvmmonnwizin// 90fkkmpyyesfo+bj8dl0rjlpudhyljoxf0rs+ymkru4fw2naiawnbg==// -----end certificate request-----// "$public_key = openssl_csr_get_public_key($csr);$info = openssl_pkey_get_details($public_key);var_dump($info['key']);// string(451) "-----begin public key-----// miibijanbgkqhkig9w0baqefaaocaq8amiibcgkcaqeavdbrehxkwucb/yqlzcco// bbgzltficoaglsedpbybnwxgfqriqrij/qgycpgvh9ex7utogsop67+jj0h8ikcd// rceomrfm7u95nbxrjjdelzff6twxnbbnb4d8pl96liatsgpjcdbbxemuivi2t7rl// i6towhxnjqusilnuadmcegsehb9ao699raqrtmrnypbcaacbpzq50haytl62gtuu// hophldpglwieaj7hhzbsi3kmky0fo35tlini2pdpszhdiyjucdjnw5mmjcky9fwx// cvje1cx+rqtk1ez41nda9ykdlfieqjs2x3yvtqsrxpzbfyg4vavp2yze2pz6rw5w// mqidaqab// -----end public key-----// "
使用 openssl_csr_new() 通过私钥来生成 csr 句柄,然后通过 openssl_csr_export() 抽取证书请求内容。可以看出,在 csr 中是包含公钥信息的,因为我们可以通过 openssl_csr_get_public_key() 和 openssl_pkey_get_details() 来抽取公钥。
当然,我们也可以通过一个函数来获取 csr 中的 dn 信息,这个函数也是可以获得外部下载的 csr 中的信息的。
print_r(openssl_csr_get_subject($csr));// array// (// [c] => cn// [st] => hunan// [l] => changsha// [o] => zyblog// [ou] => zyblog// [cn] => zyblog.xxx// [emailaddress] => zy@zyblog.xxx// )
证书签名及生成 x509 证书x509 是标准的公钥证书规范,并且只包含公钥信息。
$usercert = openssl_csr_sign($csr, null, $privkey, 365, array('digest_alg'=>'sha256'));// 证书签名,返回 x509 证书资源openssl_x509_export($usercert, $certout_string);var_dump($certout_string);// string(1391) "-----begin certificate-----// miid1zccar+gawibagibadanbgkqhkig9w0baqsfadcbhtelmakga1uebhmcq04x// djambgnvbagmbuh1bmfumrewdwydvqqhdahdagfuz3noytepma0ga1uecgwgenli// bg9nmq8wdqydvqqldaz6ewjsb2cxezarbgnvbammcnp5ymxvzy54ehgxhdaabgkq// hkig9w0bcqewdxp5qhp5ymxvzy54ehgwhhcnmjawodazmdmxndmywhcnmjewodaz// mdmxndmywjcbhtelmakga1uebhmcq04xdjambgnvbagmbuh1bmfumrewdwydvqqh// dahdagfuz3noytepma0ga1uecgwgenlibg9nmq8wdqydvqqldaz6ewjsb2cxezar// bgnvbammcnp5ymxvzy54ehgxhdaabgkqhkig9w0bcqewdxp5qhp5ymxvzy54ehgw// ggeima0gcsqgsib3dqebaquaa4ibdwawggekaoibaqcphxkrdfpo6nl6blp/ia4w// kx90bpycr7jtdtfum6zvz/ymvfpogj0svfr0b8h2zg1f/hzw8hi1sspjhusbr4bc// wj4lth49qmeniirpicmvhnyziojedbw2e8trqmw/08c5w76du1edrjx+momlrg4a// bwchc607pfksmhlfirr7urt5lse5ft6nbzbr1nlrqcghhdnczgi6/xbot3lpc3ql// ycyjqpgcndeugkkcdgdobghp9rqfjhrjwqiv9lfgx4auopgtw1b55ces0fonobga// 6jq8bujkp9ng1ysuphiu753dnxn/m1/vlhdqbsfpsfwnbmebrspetio+s8byudcn// agmbaagjudbomb0ga1uddgqwbbtor00gqjgvxyuxrrlutralrw+eyzafbgnvhsme// gdawgbtor00gqjgvxyuxrrlutralrw+eyzambgnvhrmebtadaqh/ma0gcsqgsib3// dqebcwuaa4ibaqacozymm14ytbsgim5mbki4xlp8/pxsvu08937hv6b0j5ug2lgn// q3hog7+6xmzgain9imzzudl+togjg7apz7yxv3crsguhhn3tn74gzbaysawyn5ec// sbhkoylvui4hnkxs1ddttyncrnllfsz+3n3mwomzvkcde/xvtvlmifhvva0biewl// y/b9rfyraq41csdrq9okgvzfkynna7xm/phjyqfrvm43d3wk5mciedkfa+g1bhxh// sj30m6ir02sg4bie6gpvubhctzr4bzdqm7rmfjgrsqwtahohwb8zwcxojksgol7m// 6e5yol0deuzdtnwfoq3hownpfisnsl9v0moy// -----end certificate-----// "
通过 openssl_csr_sign() 这个函数,为 csr 进行签名后获得的就是 x509 规范的一个证书内容。在这个证书中是可以提取出公钥信息的,我们可以将这个证书颁发给用户或者客户端,然后由客户端从证书中抽取公钥信息来进行数据加密。
var_dump(openssl_x509_check_private_key($certout_string, $privkey));// bool(true)// var_dump(openssl_x509_verify($certout_string, $info['key']));// bool(true)
当然,我们也可以验证当前的 x509 证书内容和我们的私钥是否匹配。下面的 openssl_x509_verify() 是 php7.4 以后才支持的函数。
pkcs 证书操作最后,我们来看一下 pkcs 签名证书。pkcs 分为 pkcs7 和 pkcs12 两种,pkcs7 一般用于数字信封加密,可以往里面添加 x509 ,会生成 pem 和 der 两种编码方式,一般我们会使用 pem ,它其实包含的就是公钥信息。
pkcs12 一般导出的就是 pfx 文件,pkcs12 还需要另外添加一个证书密码,所以 pkcs12 是可以包含私钥的。它一般用于消息交换与打包语法。
openssl_pkcs12_export ($usercert,$pkcs_string, $privkey, '123123' );var_dump($pkcs_string);// string(2585) "0�// 0�p0�l0�e� *�h�� �0� *�h��// *�h��// g�ʙݔ��8���|�d��v.d��7�i@��� 4�߹����// �`��xd�wؿhݐ�6y 3�_f�h�\�3,h{�ȁ+��l��lo1�-���i>i�// ��ahۈ��iy// ~�3���pƶ#v4��1����[0w| �v<��hqh�?q���^�k ���openssl_pkcs12_read($pkcs_string, $certs, '123123');var_dump($certs);// array(2) {// ["cert"]=>// string(1391) "-----begin certificate-----// miid1zccar+gawibagibadanbgkqhkig9w0baqsfadcbhtelmakga1uebhmcq04x// djambgnvbagmbuh1bmfumrewdwydvqqhdahdagfuz3noytepma0ga1uecgwgenli// bg9nmq8wdqydvqqldaz6ewjsb2cxezarbgnvbammcnp5ymxvzy54ehgxhdaabgkq// hkig9w0bcqewdxp5qhp5ymxvzy54ehgwhhcnmjawodazmdcwote2whcnmjewodaz// mdcwote2wjcbhtelmakga1uebhmcq04xdjambgnvbagmbuh1bmfumrewdwydvqqh// dahdagfuz3noytepma0ga1uecgwgenlibg9nmq8wdqydvqqldaz6ewjsb2cxezar// bgnvbammcnp5ymxvzy54ehgxhdaabgkqhkig9w0bcqewdxp5qhp5ymxvzy54ehgw// ggeima0gcsqgsib3dqebaquaa4ibdwawggekaoibaqcrbnha2lftbmwwzo0ropbl// ugmna7yij6zsipyidim3x5ofcazksnmrynlzgzquejs6zxvvalb3ttkxwefijl5p// fj4iw1dubytk324cu+zcz8wo2legcxxq95uyrzrvmwr1gxicwxuhnuoz6mavhnu0// hidr7w9fazm3pj1lpnw7fjkyr4vif8shh+ebs0+bzaps4zqw9ey+llnhqyzyhbf8// crf7gh7phg/86h3ozbe1vwofkzetf7+1vzwqi4y6atwooiqcxmegn8m5hodluqov// t/gwartuwug37xuleyvvultvtlwusxl9wukvvkwb1ebimnpset4zzmykcuwd+bmr// agmbaagjudbomb0ga1uddgqwbbsrsheenjt8vyskn7l8hkbt3whs8jafbgnvhsme// gdawgbsrsheenjt8vyskn7l8hkbt3whs8jambgnvhrmebtadaqh/ma0gcsqgsib3// dqebcwuaa4ibaqasaihsqrxmnkvr+m7kxfhrqvvemuwni6+v0trsbpfqgorvjehm// nsq7du+6z0rwdl7puqn5oetzmfrds16rrrbc30y/hv/zv8e2/ysmqioqy0siwdlu// naebinlpeumutz3lxcrazov1jecgd2jz18gia/w/n+1b/h0ep7zml0/wtlmjcejf// ncr9o6wkb+sttzervpubsobf3pq4dxeke/g0e8qk6oymbr76dujwutcwosrd6f68// xegjmrbhgpqnjqy28cbch1enenporec0zjbuq3vqv5mqrnmqikpqdak6nhlgoqu+// //ij5jicwm29xnockpyohbeg4kfg4shby66y// -----end certificate-----// "// ["pkey"]=>// string(1704) "-----begin private key-----// miievgibadanbgkqhkig9w0baqefaascbkgwggskageaaoibaqcrbnha2lftbmww// zo0ropblugmna7yij6zsipyidim3x5ofcazksnmrynlzgzquejs6zxvvalb3ttkx// wefijl5pfj4iw1dubytk324cu+zcz8wo2legcxxq95uyrzrvmwr1gxicwxuhnuoz// 6mavhnu0hidr7w9fazm3pj1lpnw7fjkyr4vif8shh+ebs0+bzaps4zqw9ey+llnh// qyzyhbf8crf7gh7phg/86h3ozbe1vwofkzetf7+1vzwqi4y6atwooiqcxmegn8m5// hodluqovt/gwartuwug37xuleyvvultvtlwusxl9wukvvkwb1ebimnpset4zzmyk// cuwd+bmragmbaaecggeapbscfv1nk64embqx8/qqldr6hcmdg3szok596q2mqlgg// dsn0abg6x5ox+jpvz59hflzueje1vgy7yyc4gfberdx20tefmbh+msycqp/i+0df// lc/2ccebu4u21ywupzyl5b0/r45dhyjy5fw0fftj2zazywxk6eokywnwsjevn8o1// gylbr3dhsbxp7l1semvbpzj/ibr4aqyzetsbvbp/3vow2wbmjtwqtft0/grjyq67// wnjacz1duej2ol8bi1+vg1tth7yynro0zzwlxkib2vbxpujk++4y5lved+gynwav// zre6ubw0mma7dwesld/ns9eixxg1shqiwccmsxztaqkbgqdf+cn8aoecw/ok/o/8// aih2osm2/xi4bwfrcu8dfzksp+7aexs3mudnqaune91ychjnpxs7g6s9ra6wco7n// cakgiwqn18ie9zkv6iuz9vhom8tlyc2izvunxyt99rt0vqymjfjfjy7keqye+ojg// 4nc6+xvlrta2ql8fxhh+jzxssqkbgqdd8o8kaft8azgeexvlj7uxixspbsitxj6j// ugog0mhkzl+ngmfthfvqn9dnlkfw9/ktmo9dsowncuckasvyqth4dciazmen41qi// os1zoex1fccdbwltxvkzjkxinhre9cgil/iov3mv/s5bt4sdt1qt8rc5ducqi1pk// 90wqtiy70wkbgqcwg8vbwq/vqhrjdtigr49tva6/rmprakvw8+ga1yqkczmu2uza// epymjeyqlvxkkflthcrkfz0mjhmjvm9/epyh6homrozajnr2o+3i28od0gmh0yml// azu5pbexp33k/x9cc8kyxiiwquolkgdmuywfoz5evnoposfwh2ciquahgqkbgqcx// ko1e+giedom4c0qxu2+h7gyf6sbqahorgmgcrvl/a8gqwdvt+v/4hufdq1nthk0q// kv+cwaunj781cbhssdiepvakh7fjvb/2s4tmxfqs1qvqilc3izfkthlsv66vqgcz// woutftieigumfe76mf1+f4/yreagcvbc39fahnm+0wkbganewcdh2atsmiliycxg// v0nz7o4ffj+epaxocw1kmdomuy154swsedzuwwatj1//ou5s0o/hzettn4ybyhr2// eingrvz5poin3l7enepsescv4oouesb5mlwnmqanu94uyhuvnymwolsiogkklxnm// htcaz0u0mzljy6r6patt5kpn// -----end private key-----// "// }openssl_x509_export($certs['cert'], $certout_string);var_dump($certout_string);// string(1391) "-----begin certificate-----// miid1zccar+gawibagibadanbgkqhkig9w0baqsfadcbhtelmakga1uebhmcq04x// djambgnvbagmbuh1bmfumrewdwydvqqhdahdagfuz3noytepma0ga1uecgwgenli// bg9nmq8wdqydvqqldaz6ewjsb2cxezarbgnvbammcnp5ymxvzy54ehgxhdaabgkq// hkig9w0bcqewdxp5qhp5ymxvzy54ehgwhhcnmjawodazmdcwote2whcnmjewodaz// mdcwote2wjcbhtelmakga1uebhmcq04xdjambgnvbagmbuh1bmfumrewdwydvqqh// dahdagfuz3noytepma0ga1uecgwgenlibg9nmq8wdqydvqqldaz6ewjsb2cxezar// bgnvbammcnp5ymxvzy54ehgxhdaabgkqhkig9w0bcqewdxp5qhp5ymxvzy54ehgw// ggeima0gcsqgsib3dqebaquaa4ibdwawggekaoibaqcrbnha2lftbmwwzo0ropbl// ugmna7yij6zsipyidim3x5ofcazksnmrynlzgzquejs6zxvvalb3ttkxwefijl5p// fj4iw1dubytk324cu+zcz8wo2legcxxq95uyrzrvmwr1gxicwxuhnuoz6mavhnu0// hidr7w9fazm3pj1lpnw7fjkyr4vif8shh+ebs0+bzaps4zqw9ey+llnhqyzyhbf8// crf7gh7phg/86h3ozbe1vwofkzetf7+1vzwqi4y6atwooiqcxmegn8m5hodluqov// t/gwartuwug37xuleyvvultvtlwusxl9wukvvkwb1ebimnpset4zzmykcuwd+bmr// agmbaagjudbomb0ga1uddgqwbbsrsheenjt8vyskn7l8hkbt3whs8jafbgnvhsme// gdawgbsrsheenjt8vyskn7l8hkbt3whs8jambgnvhrmebtadaqh/ma0gcsqgsib3// dqebcwuaa4ibaqasaihsqrxmnkvr+m7kxfhrqvvemuwni6+v0trsbpfqgorvjehm// nsq7du+6z0rwdl7puqn5oetzmfrds16rrrbc30y/hv/zv8e2/ysmqioqy0siwdlu// naebinlpeumutz3lxcrazov1jecgd2jz18gia/w/n+1b/h0ep7zml0/wtlmjcejf// ncr9o6wkb+sttzervpubsobf3pq4dxeke/g0e8qk6oymbr76dujwutcwosrd6f68// xegjmrbhgpqnjqy28cbch1enenporec0zjbuq3vqv5mqrnmqikpqdak6nhlgoqu+// //ij5jicwm29xnockpyohbeg4kfg4shby66y// -----end certificate-----var_dump(openssl_x509_check_private_key($certout_string, $privkey));// bool(true)
在这里的测试我们就是简单地通过 openssl_pkcs12_export() 来导出一个 pkcs12 证书,可以看到这个函数包含了 csr 、私钥 和一个自定义的证书密码。导出的内容是二进制的内容,我们可以直接将这些内容保存为一个 pfx 文件。
通过 openssl_pkcs12_read() 就可以读取一个 pfx 文件内容,获得证书的 certs 信息,也就是 csr 信息。可以看到我们用 openssl_x509_export() 导出后的结果中的私钥与我们最开始创建的是私钥是匹配的。
总结关于证书的内容还有不少函数没有讲到,不过我们通过上面这些代码已经可以生成一些简单的证书了。并且也可以读取不少证书的内容并获得它们的信息。本身加密这一块就是一门非常高深的学科,有兴趣的同学可以继续深入地研究。上面提到的 csr 、 x509 、 pkcs 相关的内容以及生成的文件在许多地方都可以见到,比如 https 申请成功后下载的证书,微信、支付宝相关第三方接口等。大家可以自己尝试读取解析这些证书,这样动手才能对相关的知识有更深入地了解。
测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202007/source/php%e7%9a%84openssl%e5%8a%a0%e5%af%86%e6%89%a9%e5%b1%95%e5%ad%a6%e4%b9%a0%ef%bc%88%e4%b8%89%ef%bc%89%ef%bc%9a%e8%af%81%e4%b9%a6%e6%93%8d%e4%bd%9c.php
推荐学习:php视频教程
以上就是php如何使用openssl加密中的证书操作的详细内容。
其它类似信息

推荐信息