Heim > Artikel > Backend-Entwicklung > So implementieren Sie die bidirektionale https-Authentifizierung in PHP
So implementieren Sie https in PHP: Ändern Sie zuerst die OpenSSL-Konfiguration und legen Sie dann das Zertifikatskennwort auf mindestens 6 Zeichen fest. Erstellen Sie dann ein Serverzertifikat und ein Client-Zertifikat und führen Sie einen PHP-Curl-Test durch.
Empfohlen: „PHP-Video-Tutorial“
php implementiert die bidirektionale HTTPS-Authentifizierung (tls/ssl)
Normalerweise basiert die Bereitstellung von https auch auf der unidirektionalen SSL-Authentifizierung Das heißt, solange der Client den Server authentifiziert, muss der Server den Client nicht authentifizieren.
Aber in einigen Szenarien mit höherer Sicherheit, wie z. B. im Bankwesen, im Finanzwesen und in anderen Bereichen, ist normalerweise eine Kundenauthentifizierung erforderlich. Dies ermöglicht die bidirektionale Authentifizierung von SSL.
Da der Parameter ssl_client_certificate von nginx nur einen öffentlichen Clientschlüssel angeben kann, müssen Sie einen neuen Server konfigurieren, wenn Sie einen Client für die Kommunikation hinzufügen. Der
n:1-Modus wird durch den Kaskadenzertifikatmodus der Zertifizierungsstelle implementiert. Generieren Sie zunächst selbst einen Satz von CA-Zertifikaten auf Stammebene und verwenden Sie ihn dann, um ein sekundäres Zertifikat als Client-Zertifikat zu generieren.
Zu diesem Zeitpunkt kann die Signatur des privaten Schlüssels des Clients nicht nur durch den entsprechenden öffentlichen Schlüssel des Clients, sondern auch durch den öffentlichen Schlüssel des Stammzertifikats überprüft werden.
Sie sollten sich darüber im Klaren sein, nachdem Sie dies gesehen haben. Hier finden Sie eine kurze Einführung in die Bedienung:
1 Vorbereitung
1.1 Vorbereitung des OpenSSL-Verzeichnisses
Im Allgemeinen befinden sich die Konfigurationsdateien von OpenSSL in diesem Verzeichnis /etc/pki/tls. also:
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-Konfigurationsvorbereitung
OpenSSL-Konfiguration ändern
vi /etc/pki/tls/openssl.cnf
Kommentieren Sie diesen Satz aus und ersetzen Sie ihn durch den folgenden Satz
#default_ca = CA_default default_ca = CA_linvo
Kopieren Sie den gesamten Teil von [CA_default ] Eine Kopie, ändern Sie sie in den obigen Namen [CA_linvo]
Ändern Sie die folgenden Parameter darin:
dir = /etc/pki/ca_linvo certificate = $dir/root/ca.crt private_key = $dir/root/ca.key
Speichern und beenden
2 Erstellen Sie ein CA-Root-Level-Zertifikat
生成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
Die generierten Root-Level-Zertifikatdateien sind alle vorhanden /etc/pki/ca_linvo/ Unter dem Root-Verzeichnis
Hinweis: Beim Erstellen eines Zertifikats wird empfohlen, dass die Länge des Zertifikatskennworts >= 6 Zeichen beträgt, da das Keytool-Tool von Java anscheinend Anforderungen dafür hat.
3 Serverzertifikat erstellen
生成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
Anleitung:
1. Das hier generierte CRT ist das gerade unter dem CA-Stammzertifikat erstellte Kaskadenzertifikat Der Kaskadenmodus wird nicht verwendet. Sie können auch:
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 Mit dem Parameter -days können Sie die Gültigkeitsdauer des Zertifikats nach Bedarf festlegen. Der Standardwert ist beispielsweise 365 Tage.
生成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
Anleitung:
1. Hier muss ein kaskadierendes Zertifikat verwendet werden, und Sie können die Schritte zum Erstellen mehrerer Sätze von Client-Zertifikaten wiederholen.
Beim Generieren von CRT kann der folgende Fehler auftreten:
openssl TXT_DB error number 2 failed to update database
Sie können hier nachlesen die Operation.
Ich verwende Methode eins, also unique_subject = no
5 in index.txt.attr, um nginx zu konfigurieren
Nur die wichtigsten Teile des Serversegments werden hier aufgelistet:
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;#根级证书公钥,用于验证各个二级client ssl_verify_client on;
Neustarten von Nginx
6 Test
6.1 Browsertest die lokale Maschine. Das unter Windows installierte Zertifikat erfordert das PFX-Format, auch P12-Format genannt. Die Generierungsmethode ist wie folgt: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.pfxDann gehen Sie zu Windows und doppelklicken Sie, um es zu installieren Generierung des Zertifikats. Nach erfolgreicher Installation starten Sie den Browser neu und geben die URL ein, um darauf zuzugreifen. Der Browser fordert Sie möglicherweise auf, ein Zertifikat auszuwählen, das Sie gerade installiert haben. Zu diesem Zeitpunkt werden einige Browser Benutzer darauf hinweisen, dass das Zertifikat nicht vertrauenswürdig ist, die Adresse unsicher ist usw. Dies liegt daran, dass unser Serverzertifikat von uns selbst ausgestellt wird und nicht von einer echten autoritativen CA-Organisation (normalerweise sehr teuer ~). ignoriere es einfach. 6.2 PHP Curl-TestHier sind nur die wichtigsten Curl-Parameter, die eingestellt werden müssen:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何证书,不是CA机构颁布的也没关系 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); // 检查证书中是否设置域名,如果不想验证也可设为0 curl_setopt($ch, CURLOPT_VERBOSE, '1'); //debug模式,方便出错调试 curl_setopt($ch, CURLOPT_SSLCERT, CLIENT_CRT); //client.crt文件路径,这里我用常量代替 curl_setopt($ch, CURLOPT_SSLCERTPASSWD, CRT_PWD); //client证书密码 curl_setopt($ch, CURLOPT_SSLKEY, CLIENT_KEY); //client.key文件路径 CURLOPT_TIMEOUT:超时时间 CURLOPT_RETURNTRANSFER:是否要求返回数据 CURLOPT_SSL_VERIFYPEER:是否检测服务器的证书是否由正规浏览器认证过的授权CA颁发的 CURLOPT_SSL_VERIFYHOST:是否检测服务器的域名与证书上的是否一致 CURLOPT_SSLCERTTYPE:证书类型,"PEM" (default), "DER", and"ENG". CURLOPT_SSLCERT:证书存放路径 CURLOPT_SSLCERTPASSWD:证书密码,没有可以留空 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; }Die Überprüfung ist fehlgeschlagen und im Nginx-Fehlerprotokoll werden die folgenden Informationen angezeigt:
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:4436.3 PHP Soap-TestSie Sie müssen zuerst das Client-Zertifikat im PEM-Format erstellen. Sie können auch den Befehl openssl verwenden. Da wir jedoch bereits über crt und key verfügen, ist das manuelle Zusammenführen ebenfalls sehr einfach: Erstellen Sie eine neue Datei und geben Sie -----BEGIN CERTIFICATE- ein. ---- und - in crt Kopieren Sie den Base64-Inhalt zwischen ----END CERTIFICATE----- (einschließlich dieser beiden Trennlinien) und fügen Sie dann -----BEGIN RSA PRIVATE KEY----- und ein ---- im Schlüssel. Kopieren Sie den Inhalt zwischen -END RSA PRIVATE KEY----- und speichern Sie ihn als client.pem. Wenn es einfacher ist, können Sie die beiden Dateien auch direkt mit dem folgenden Befehl zusammenführen:
cat /etc/pki/ca_linvo/client/client.crt /etc/pki/ca_linvo/client/client.key > /etc/pki/ca_linvo/client/client.pemMit der PEM-Datei können Sie den in PHP integrierten SoapClient verwenden, um den zweiten Parameter festzulegen :
$header = array( 'local_cert' => CLIENT_PEM, //client.pem文件路径 'passphrase' => CRT_PWD //client证书密码 ); $client = new SoapClient(FILE_WSDL, $header); //FILE_WSDL为要访问的https地址Vorheriger Blog: Wenn local_cert auf einen Remote-Pfad eingestellt ist, wird anscheinend ein Fehler gemeldet, weil das Client-Zertifikat beim ersten Abrufen der WSDL nicht verwendet wurde als lokale Datei zum Aufrufen aufzubewahren; In diesem Test gab es jedoch keine Notwendigkeit, sie als lokale Datei zu speichern, sondern sie einfach aus der Ferne abzurufen. Ich dachte ursprünglich, dass es ein Problem mit dem vorherigen Zertifikat gäbe, aber ich kann immer noch den vorherigen Satz von Zertifikaten verwenden, was sehr seltsam ist~~~~~
Das obige ist der detaillierte Inhalt vonSo implementieren Sie die bidirektionale https-Authentifizierung in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!