Heim  >  Artikel  >  Backend-Entwicklung  >  So implementieren Sie die bidirektionale https-Authentifizierung in PHP

So implementieren Sie die bidirektionale https-Authentifizierung in PHP

藏色散人
藏色散人Original
2020-08-11 09:12:114550Durchsuche

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.

So implementieren Sie die bidirektionale https-Authentifizierung in PHP

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.pfx

Dann 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-Test

Hier 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:443

6.3 PHP Soap-Test

Sie 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.pem

Mit 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn