1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問(wèn)題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
      php如何實(shí)現(xiàn)https雙向認(rèn)證

      php實(shí)現(xiàn)https的方法:首先修改openssl配置;然后創(chuàng)建CA根級(jí)證書(shū),并將證書(shū)密碼設(shè)置長(zhǎng)度大于或等于6位;接著創(chuàng)建server證書(shū)和client證書(shū);最后配置nginx并進(jìn)行php curl測(cè)試即可。

      創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供孫吳網(wǎng)站建設(shè)、孫吳做網(wǎng)站、孫吳網(wǎng)站設(shè)計(jì)、孫吳網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、孫吳企業(yè)網(wǎng)站模板建站服務(wù),10余年孫吳做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

      推薦:《PHP視頻教程》

      php實(shí)現(xiàn)https(tls/ssl)雙向認(rèn)證

      通常情況下,在部署https的時(shí)候,是基于ssl單向認(rèn)證的,也就是說(shuō)只要客戶端認(rèn)證服務(wù)器,而服務(wù)器不需要認(rèn)證客戶端。

      但在一些安全性較高的場(chǎng)景,如銀行,金融等領(lǐng)域,通常會(huì)要求進(jìn)行客戶端認(rèn)證。從而實(shí)現(xiàn)ssl的雙向認(rèn)證。

      由于nginx的ssl_client_certificate參數(shù)只能指定一個(gè)客戶端公鑰,如果增加一個(gè)客戶端進(jìn)行通信就要重新配一個(gè)server。

      n:1的模式是通過(guò)CA的級(jí)聯(lián)證書(shū)模式實(shí)現(xiàn)的,首先自己生成一套CA根級(jí)證書(shū),再借助其生成二級(jí)證書(shū)作為client證書(shū)。

      此時(shí)client私鑰簽名不僅可以通過(guò)對(duì)應(yīng)的client公鑰驗(yàn)證,還可通過(guò)根證書(shū)的公鑰進(jìn)行驗(yàn)證。

      看到這里應(yīng)該豁然開(kāi)朗了吧,下面簡(jiǎn)單介紹下具體怎么操作:

      1 準(zhǔn)備工作

      1.1 openssl目錄準(zhǔn)備

      一般情況下openssl的配置文件都在這個(gè)目錄/etc/pki/tls,so:

      mkdir /etc/pki/ca_linvo
      cd /etc/pki/ca_linvo
      mkdir root server client newcerts
      echo 01 > serial
      echo 01 > crlnumber
      touch index.txt

      1.2 openssl配置準(zhǔn)備

      修改openssl配置

      vi /etc/pki/tls/openssl.cnf

      找到這句注釋掉,替換為下面那句

      #default_ca      = CA_default
      default_ca      = CA_linvo

      把[ CA_default ]整個(gè)部分拷貝一份,改成上面的名字[ CA_linvo ]

      修改里面的如下參數(shù):

      dir = /etc/pki/ca_linvo
      certificate = $dir/root/ca.crt
      private_key = $dir/root/ca.key

      保存退出

      2 創(chuàng)建CA根級(jí)證書(shū)

      生成key:openssl genrsa -out /etc/pki/ca_linvo/root/ca.key
      生成csr:openssl req -new -key /etc/pki/ca_linvo/root/ca.key -out /etc/pki/ca_linvo/root/ca.csr
      生成crt:openssl x509 -req -days 3650 -in /etc/pki/ca_linvo/root/ca.csr -signkey /etc/pki/ca_linvo/root/ca.key -out /etc/pki/ca_linvo/root/ca.crt
      生成crl:openssl ca -gencrl -out /etc/pki/ca_linvo/root/ca.crl -crldays 7

      生成的根級(jí)證書(shū)文件都在/etc/pki/ca_linvo/root/目錄下

      注意:創(chuàng)建證書(shū)時(shí),建議證書(shū)密碼設(shè)置長(zhǎng)度>=6位,因?yàn)镴ava的keytool工具貌似對(duì)它有要求。

      3 創(chuàng)建server證書(shū)

      生成key:openssl genrsa -out /etc/pki/ca_linvo/server/server.key
      生成csr:openssl req -new -key /etc/pki/ca_linvo/server/server.key -out /etc/pki/ca_linvo/server/server.csr
      生成crt:openssl ca -in /etc/pki/ca_linvo/server/server.csr -cert /etc/pki/ca_linvo/root/ca.crt -keyfile /etc/pki/ca_linvo/root/ca.key -out /etc/pki/ca_linvo/server/server.crt -days 3650

      說(shuō)明:

      1、這里生成的crt是剛才ca根級(jí)證書(shū)下的級(jí)聯(lián)證書(shū),其實(shí)server證書(shū)主要用于配置正常單向的https,所以不使用級(jí)聯(lián)模式也可以:

      openssl rsa -in /etc/pki/ca_linvo/server/server.key -out /etc/pki/ca_linvo/server/server.key
      openssl x509 -req -in /etc/pki/ca_linvo/server/server.csr -signkey /etc/pki/ca_linvo/server/server.key -out /etc/pki/ca_linvo/server/server.crt -days 3650

      2、-days 參數(shù)可根據(jù)需要設(shè)置證書(shū)的有效期,例如默認(rèn)365天

      4 創(chuàng)建client證書(shū)

      生成key:openssl genrsa -des3 -out /etc/pki/ca_linvo/client/client.key 1024
      生成csr:openssl req -new -key /etc/pki/ca_linvo/client/client.key -out /etc/pki/ca_linvo/client/client.csr
      生成crt:openssl ca -in /etc/pki/ca_linvo/client/client.csr -cert /etc/pki/ca_linvo/root/ca.crt -keyfile /etc/pki/ca_linvo/root/ca.key -out /etc/pki/ca_linvo/client/client.crt -days 3650

      說(shuō)明:

      1、這里就必須使用級(jí)聯(lián)證書(shū),并且可以重復(fù)該步驟,創(chuàng)建多套client證書(shū)

      2、生成crt時(shí)可能會(huì)遇到如下報(bào)錯(cuò):

      openssl TXT_DB error number 2 failed to update database

      可參照這里進(jìn)行操作。

      我使用的是方法一,即將index.txt.attr中unique_subject = no

      5 配置nginx

      這里只列出server段的關(guān)鍵部分:

      ssl_certificate  /etc/pki/ca_linvo/server/server.crt;#server公鑰
      ssl_certificate_key  /etc/pki/ca_linvo/server/server.key;#server私鑰
      ssl_client_certificate   /etc/pki/ca_linvo/root/ca.crt;#根級(jí)證書(shū)公鑰,用于驗(yàn)證各個(gè)二級(jí)client
      ssl_verify_client on;

      重啟Nginx

      6 測(cè)試

      6.1 瀏覽器測(cè)試

      由于是雙向認(rèn)證,直接通過(guò)瀏覽器訪問(wèn)https地址是被告知400 Bad Request(No required SSL certificate was sent)的,需要在本機(jī)安裝client證書(shū)。

      windows上安裝的證書(shū)需要pfx格式,也叫p12格式,生成方式如下:

      openssl pkcs12 -export -inkey /etc/pki/ca_linvo/client/client.key -in /etc/pki/ca_linvo/client/client.crt -out /etc/pki/ca_linvo/client/client.pfx

      然后考到windows中雙擊即可進(jìn)行安裝,安裝時(shí)會(huì)提示輸入生成證書(shū)時(shí)設(shè)置的密碼。

      安裝成功后,重啟瀏覽器輸入網(wǎng)址訪問(wèn),瀏覽器可能會(huì)提示你選擇證書(shū),選擇剛才安裝的那個(gè)證書(shū)即可。

      此時(shí)有些瀏覽器會(huì)提示用戶該證書(shū)不受信任,地址不安全之類,這是因?yàn)槲覀兊膕erver證書(shū)是我們自己頒發(fā)的,而非真正的權(quán)威CA機(jī)構(gòu)頒布(通常很貴哦~),忽略它既可。

      6.2 php curl測(cè)試

      這里只列出關(guān)鍵的需要設(shè)置的curl參數(shù):

      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何證書(shū),不是CA機(jī)構(gòu)頒布的也沒(méi)關(guān)系  
      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); // 檢查證書(shū)中是否設(shè)置域名,如果不想驗(yàn)證也可設(shè)為0  
      curl_setopt($ch, CURLOPT_VERBOSE, '1'); //debug模式,方便出錯(cuò)調(diào)試  
      curl_setopt($ch, CURLOPT_SSLCERT, CLIENT_CRT); //client.crt文件路徑,這里我用常量代替  
      curl_setopt($ch, CURLOPT_SSLCERTPASSWD, CRT_PWD); //client證書(shū)密碼  
      curl_setopt($ch, CURLOPT_SSLKEY, CLIENT_KEY); //client.key文件路徑  
       
      CURLOPT_TIMEOUT:超時(shí)時(shí)間
      CURLOPT_RETURNTRANSFER:是否要求返回?cái)?shù)據(jù)
      CURLOPT_SSL_VERIFYPEER:是否檢測(cè)服務(wù)器的證書(shū)是否由正規(guī)瀏覽器認(rèn)證過(guò)的授權(quán)CA頒發(fā)的
      CURLOPT_SSL_VERIFYHOST:是否檢測(cè)服務(wù)器的域名與證書(shū)上的是否一致
      CURLOPT_SSLCERTTYPE:證書(shū)類型,"PEM" (default), "DER", and"ENG".
      CURLOPT_SSLCERT:證書(shū)存放路徑
      CURLOPT_SSLCERTPASSWD:證書(shū)密碼,沒(méi)有可以留空
      CURLOPT_SSLKEYTYPE:私鑰類型,"PEM" (default), "DER", and"ENG".
      CURLOPT_SSLKEY:私鑰存放路徑
       
       
      function curl_post_ssl($url, $vars, $second=30,$aHeader=array())
      {
          $ch = curl_init();
          //curl_setopt($ch,CURLOPT_VERBOSE,'1');
          curl_setopt($ch,CURLOPT_TIMEOUT,$second);
          curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
          curl_setopt($ch,CURLOPT_URL,$url);
          curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
          curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
          curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
          curl_setopt($ch,CURLOPT_SSLCERT,'/data/cert/php.pem');
          curl_setopt($ch,CURLOPT_SSLCERTPASSWD,'1234');
          curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
          curl_setopt($ch,CURLOPT_SSLKEY,'/data/cert/php_private.pem');
       
          if( count($aHeader) >= 1 ){
                  curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
          }
       
          curl_setopt($ch,CURLOPT_POST, 1);
          curl_setopt($ch,CURLOPT_POSTFIELDS,$vars);
          $data = curl_exec($ch);
          curl_close($ch);
          if($data)
                  return $data;
          else         return false;
      }

      驗(yàn)證失敗,nginx的錯(cuò)誤日志中,會(huì)有如下信息

      2017/06/05 17:45:07 [crit] 16084#0: *27458991 SSL_do_handshake() failed (SSL: error:04067084:rsa routines:RSA_EAY_PUBLIC_DECRYPT:data too large for modulus e
      rror:1408807A:SSL routines:ssl3_get_cert_verify:bad rsa signature) while SSL handshaking, client: 116.255.208.194, server: 0.0.0.0:443

      6.3 php soap測(cè)試

      首先需要構(gòu)建client的pem格式證書(shū),通過(guò)openssl命令也可以,不過(guò)因?yàn)槲覀円呀?jīng)有了crt和key,所以手動(dòng)合并也很簡(jiǎn)單:

      新建一個(gè)文件,把crt中-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----之間的base64內(nèi)容(包括這兩個(gè)分割線)拷貝進(jìn)去,然后把key中-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----之間的內(nèi)容也復(fù)制進(jìn)去,然后保存為client.pem即可。

      其實(shí)更省事的話可以如下命令,直接合并兩個(gè)文件:

      cat /etc/pki/ca_linvo/client/client.crt /etc/pki/ca_linvo/client/client.key > /etc/pki/ca_linvo/client/client.pem

      有了pem文件,下面可以使用php內(nèi)置的SoapClient進(jìn)行調(diào)用,構(gòu)造函數(shù)需要設(shè)置第二個(gè)參數(shù):

      $header = array(        'local_cert' => CLIENT_PEM, //client.pem文件路徑'passphrase' => CRT_PWD //client證書(shū)密碼);  
      $client = new SoapClient(FILE_WSDL, $header); //FILE_WSDL為要訪問(wèn)的https地址

      上一篇博客里最后說(shuō)到local_cert設(shè)置成遠(yuǎn)程路徑的話會(huì)報(bào)錯(cuò),好像是因?yàn)榈谝淮潍@取wsdl時(shí)并沒(méi)有使用client證書(shū)的原因,需要將wsdl保持成本地文件進(jìn)行調(diào)用;

      但是這次測(cè)試卻沒(méi)問(wèn)題,不用另存為本地文件,直接遠(yuǎn)程獲取即可。

      本來(lái)認(rèn)為是之前的證書(shū)有問(wèn)題,但是使用之前的那套證書(shū)依然可以,很是詭異~~~~~
      網(wǎng)站名稱:php如何實(shí)現(xiàn)https雙向認(rèn)證
      鏈接地址:http://www.ef60e0e.cn/article/cphced.html

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        肇东市| 闵行区| 江源县| 奉化市| 扬州市| 新田县| 安庆市| 泽库县| 江都市| 盐边县| 南京市| 垦利县| 田东县| 白银市| 南平市| 衡南县| 崇礼县| 浠水县| 阿拉尔市| 桐柏县| 淮阳县| 台山市| 寻乌县| 奉贤区| 新源县| 达孜县| 星子县| 东乡族自治县| 衡水市| 富源县| 民权县| 凤台县| 台中县| 红安县| 遂溪县| 甘泉县| 怀安县| 余庆县| 文昌市| 定安县| 怀来县|