Heim > 类库下载 > java类库 > Der Java-Keystore implementiert die bidirektionale SSL-Authentifizierung [Client ist PHP und Java]

Der Java-Keystore implementiert die bidirektionale SSL-Authentifizierung [Client ist PHP und Java]

巴扎黑
Freigeben: 2016-11-09 14:30:51
Original
2244 Leute haben es durchsucht

1. Erstellen Sie zunächst die serverseitige Umgebung:

Vorbereitungsarbeit: ein Tomcat6-, JDK7-, OpenSSL-, Javawebservice-Testprojekt

2. Konstruktionsprozess:

Referenz http: //blog.csdn.net/chow__zh/article/details/8998499

1.1 Serverzertifikat generieren

keytool -genkey -v -alias tomcat -keyalg RSA -keystore D:/SSL / server/tomcat.keystore -dname "CN=127.0.0.1,OU=zlj,O=zlj,L=Peking,ST=Peking,C=CN" -validity 3650 -storepass zljzlj -keypass zljzlj

Hinweis:
keytool ist das vom JDK bereitgestellte Tool zur Zertifikatserstellung. Weitere Informationen zur Verwendung aller Parameter finden Sie unter keytool –help
-genkey zum Erstellen eines neuen Zertifikats
-v 🎜>-alias tomcat mit „tomcat“ als Alias ​​des Zertifikats. Hier können Sie den
-keyalg RSA-spezifizierten Algorithmus
-keystore D:/SSL/server/tomcat.keystore Speicherpfad und Dateinamen ändern
-dname "CN=127.0.0.1,OU=zlj,O = zlj,L=Peking,ST=Peking,C=CN“ Die Identität des Zertifikatausstellers. Der CN muss hier nach der Ausstellung mit dem Zugriffsdomänennamen übereinstimmen. Da wir das Zertifikat aber selbst ausstellen, wird es dennoch eine Warnung geben, wenn Sie in einem Browser darauf zugreifen.
-validity 3650 Zertifikatsgültigkeitsdauer, in Tagen
-storepass zljzlj Zertifikatszugriffspasswort
-keypass zljzlj privater Zertifikatsschlüssel
1.2 Client-Zertifikat generieren
Befehl ausführen:
keytool ‐genkey ‐ v ‐Alias ​​Client ‐keyalg RSA ‐storetype PKCS12 ‐keystore D:/SSL/client/client.p12 ‐dname „CN=client,OU=zlj,O=zlj,L=bj,ST=bj,C =CN“ ‐ Gültigkeit 3650 ‐storepass client ‐keypass client
Beschreibung:
Parameterbeschreibung ist die gleiche wie oben. Die Identität des -dname-Zertifikatausstellers kann sich von der vorherigen unterscheiden. Bisher besteht zwischen diesen beiden Zertifikaten keine Beziehung. Als nächstes gilt es, eine Vertrauensbeziehung zwischen den beiden aufzubauen.
1.3 Client-Zertifikat exportieren
Befehl ausführen:
keytool ‐export ‐alias client ‐keystore D:/SSL/client/client.p12 ‐storetype PKCS12 ‐storepass client ‐rfc ‐file D:/SSL/ client /client.cer
Beschreibung:
-export Export ausführen
-Datei Dateipfad der Exportdatei
1.4 Das Client-Zertifikat zur Serverzertifikat-Vertrauensliste hinzufügen
Befehl ausführen:
keytool ‐import ‐alias client ‐v ‐file D:/SSL/client/client.cer ‐keystore D:/SSL/server/tomcat.keystore ‐storepass zljzlj
Beschreibung:
Parameterbeschreibung ist die gleiche wie zuvor . Das hier angegebene Passwort ist das Zugangspasswort für das Serverzertifikat.
1.5 Serverzertifikat exportieren
Führen Sie den Befehl aus:
keytool -export -alias tomcat -keystore D:/SSL/server/tomcat.keystore -storepass zljzlj -rfc -file D:/SSL/server/ tomcat .cer
Anleitung:
Exportieren Sie das Serverzertifikat. Das hier angegebene Passwort ist gleichzeitig das Passwort für das Serverzertifikat.
1.6 Client-Vertrauensliste erstellen
Befehl ausführen:
keytool -import -file D:/SSL/server/tomcat.cer -storepass zljzlj -keystore D:/SSL/client/client.truststore -alias tomcat –noprompt
Anweisungen:
Lassen Sie den Client dem Serverzertifikat vertrauen
2. Konfigurieren Sie den Server so, dass er nur HTTPS-Verbindungen zulässt
2.1 Konfigurieren Sie /conf/server.xml im Tomcat-Verzeichnis
Xml-Code Sammlungscode
maxThreads="150" scheme="https" secure="true" clientAuth="true" sslProtocol="TLS" keystoreFile="D:/SSL/server/tomcat.keystore"
keystorePass="zljzlj" truststoreFile="D:/SSL/server/tomcat.keystore"
truststorePass="zljzlj" / > 
Hinweis:

Dieser Inhalt in server.xml wurde ursprünglich auskommentiert. Wenn Sie den Standardport 443 von https verwenden möchten, ändern Sie bitte den Portparameter hier. ClientAuth="true" gibt die bidirektionale Zertifikatauthentifizierung an.

2. Importieren Sie client.p12 in das persönliche Zertifikatelement des Browsers.

Geben Sie jetzt https://127.0.0.1:8443/ ein und eine Zertifikatsauswahl wird angezeigt. Klicken Sie auf „OK“ und Sie werden gefragt, ob die https-Seite nicht sicher ist oder nicht. Der Server ist nun eingerichtet.

3.java ruft die Serverseite auf und lädt den Code direkt hoch:

package test;
import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
/**
 * 
 * @author gshen
 *
 */
public class TestEcVoteNotice {
 public static void main(String [] args) throws Exception {  
   System.setProperty("javax.net.ssl.trustStorePassword","zljzlj");    
   System.setProperty("javax.net.ssl.keyStoreType","PKCS12") ;    
   System.setProperty("javax.net.ssl.keyStore","D:/SSL/client/client.p12") ;    
   System.setProperty("javax.net.ssl.keyStorePassword","client") ;          
       System.setProperty("javax.net.debug", "all");
       
     //wsdl地址
String endpoint = "https://192.168.1.146:8443/pro/ws/getInfoService?wsdl";
//http://jarfiles.pandaidea.com/ 搜索axis.jar并下载,Service类在axis.jar
Service service = new Service();
//http://jarfiles.pandaidea.com/ 搜索axis.jar并下载,Call类在axis.jar
Call call = null;
try {
call = (Call) service.createCall();
//设置Call的调用地址
call.setTargetEndpointAddress(new java.net.URL(endpoint));
//根据wsdl中 <wsdl:import location="https://192.168.10.24:8443/ShinService/HelloWorld?wsdl=HelloService.wsdl" 
//namespace="http://server.cxf.shinkong.cn/" /> ,
//<wsdl:operation name="findALL">
call.setOperationName(new QName("http://ws.task.xm.com/","sayHello"));  
//参数1对应服务端的@WebParam(name = "tableName") 没有设置名称为arg0
call.addParameter("id", XMLType.SOAP_STRING, javax.xml.rpc.ParameterMode.IN);
           //调用方法的返回值
           call.setReturnType(org.apache.axis.Constants.XSD_STRING);  
           //调用用Operation调用存储过程(以服务端的方法为准)
String res = (String) call.invoke(new Object[] {"1"});  //调用存储过程
System.out.println(res);
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
     }  
}
Nach dem Login kopieren
Direkt über die Befehlszeile ausführen oder mit der rechten Maustaste auf Ausführen als klicken Das Protokoll wird gedruckt, solange der Anruf erfolgt. Nach der Ausführung

Bitte beachten Sie den Anhang.

Hier kommt der entscheidende Punkt: Der PHP-SoapClient erkennt nur Zertifikate im DER-, PEM- oder ENG-Format, daher muss client.p12 in eine PEM-Datei konvertiert werden In diesem Fall verwenden Sie bei OpenSSL zunächst die Befehlszeile cmd und geben Sie den folgenden Code ein:

Java-Code

openssl pkcs12 -in D:\SSL\client\client.p12 -out D:\SSL\client\client-cer.pem -clcerts
Nach dem Login kopieren
Wenn der Prompt-OpenSSL-Befehl nicht erkannt wird, Dies bedeutet, dass Sie openssl nicht installiert haben. Nach der Eingabe werden Sie aufgefordert, das Passwort für die exportierte Datei cer.pe einzugeben sind fertig. Client-cer.pem wurde erfolgreich generiert! .

Geben Sie nun den PHP-Code ein:

PHP-Code

$params = array(&#39;id&#39; => &#39;2&#39;);  
  
    $local_cert = "./client-cer.pem";  
    set_time_limit(0);  
    try{  
        //ini_set("soap.wsdl_cache_enabled", "0"); // disabling WSDL cache  
        $wsdl=&#39;https://192.168.1.146:8443/pro/ws/getInfoService?wsdl&#39;;  
    //  echo file_get_contents($wsdl);  
          
        $soap=new SoapClient($wsdl,   
                    array(  
                        &#39;trace&#39;=>true,  
                        &#39;cache_wsdl&#39;=>WSDL_CACHE_NONE,   
                        &#39;soap_version&#39;   => SOAP_1_1,   
                        &#39;local_cert&#39; => $local_cert, //client证书信息  
                        &#39;passphrase&#39;=> &#39;client&#39;, //密码  
                       // &#39;allow_self_signed&#39;=> true  
                    )  
                );  
        $result=$soap->sayHello($params);  
        $result_json= json_encode($result);  
        $result= json_decode($result_json,true);  
        echo &#39;结果为:&#39; . json_decode($result[&#39;return&#39;],true);  
    }catch(Exception $e) {  
        $result[&#39;success&#39;] = &#39;0&#39;;  
        $result[&#39;msg&#39;] = &#39;请求超时&#39;;  
        echo $e->getMessage();  
    }  
    echo &#39;>>>>>>>>>>>&#39;;
Nach dem Login kopieren

 直接运行,也会出现附件中的结果,打完收工,憋了我整整三天时间,终于搞定了。


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage