>类库下载 >java类库 >Java 키 저장소는 SSL 양방향 인증을 구현합니다. [클라이언트는 php 및 java입니다.]

Java 키 저장소는 SSL 양방향 인증을 구현합니다. [클라이언트는 php 및 java입니다.]

巴扎黑
巴扎黑원래의
2016-11-09 14:30:512218검색

1. 먼저 서버사이드 환경 구축:

준비 작업: tomcat6, jdk7, openssl, javawebservice 테스트 프로젝트

2. 구축 과정:

참고 http: //blog.csdn.net/chow__zh/article/details/8998499

1.1 서버 인증서 생성

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

참고:
keytool은 JDK에서 제공하는 인증서 생성 도구입니다. 모든 매개변수 사용에 대한 자세한 내용은 keytool –help
-genkey를 참조하여 새 인증서를 생성하세요
-v
-별칭 tomcat을 "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" 인증서 발급자의 ID입니다. 여기의 CN은 발급 후 액세스 도메인 이름과 일치해야 합니다. 하지만 저희가 직접 인증서를 발급하기 때문에 브라우저에서 접속하면 여전히 경고가 뜹니다.
-유효성 3650 인증서 유효 기간(일)
-storepass zljzlj 인증서 액세스 비밀번호
-keypass zljzlj 인증서 개인 키
1.2 클라이언트 인증서 생성
실행 명령:
keytool ‐genkey ‐ v ‐별칭 클라이언트 ‐keyalg RSA ‐storetype PKCS12 ‐keystore D:/SSL/client/client.p12 ‐dname "CN=client,OU=zlj,O=zlj,L=bj,ST=bj,C =CN" ‐ 유효성 3650 ‐storepass client ‐keypass client
설명:
매개변수 설명은 위와 동일합니다. 여기서 -dname 인증서 발급자 ID는 이전 ID와 다를 수 있습니다. 지금까지 이 두 인증서는 관계가 없습니다. 다음으로 해야 할 일은 둘 사이에 신뢰 관계를 구축하는 것이다.
1.3 클라이언트 인증서 내보내기
실행 명령:
keytool ‐export ‐alias client ‐keystore D:/SSL/client/client.p12 ‐storetype PKCS12 ‐storepass client ‐rfc ‐file D:/SSL/ client /client.cer
설명:
-export 내보내기 실행
-file 내보내기 파일의 파일 경로
1.4 클라이언트 인증서를 서버 인증서 신뢰 목록에 추가
실행 명령:
keytool ‐import ‐alias client ‐v ‐file D:/SSL/client/client.cer ‐keystore D:/SSL/server/tomcat.keystore ‐storepass zljzlj
설명:
매개변수 설명은 이전과 동일합니다. . 여기에 제공된 비밀번호는 서버 인증서에 대한 액세스 비밀번호입니다.
1.5 서버 인증서 내보내기
다음 명령을 실행합니다:
keytool -export -alias tomcat -keystore D:/SSL/server/tomcat.keystore -storepass zljzlj -rfc -file D:/SSL/server/ tomcat .cer
지침:
서버 인증서를 내보냅니다. 여기에 제공된 비밀번호는 서버 인증서의 비밀번호이기도 합니다.
1.6 클라이언트 신뢰 목록 생성
실행 명령:
keytool -import -file D:/SSL/server/tomcat.cer -storepass zljzlj -keystore D:/SSL/client/client.truststore -alias tomcat –noprompt
지침:
클라이언트가 서버 인증서를 신뢰하도록 합니다
2. HTTPS 연결만 허용하도록 서버를 구성합니다
2.1 Tomcat 디렉터리에서 /conf/server.xml을 구성합니다.
Xml 코드 수집 코드
maxThreads="150"cheme="https" secure="true" clientAuth="true"
sslProtocol="TLS" keystoreFile="D:/SSL/server/tomcat.keystore"
keystorePass="zljzlj" truststoreFile="D:/SSL/server/tomcat.keystore"
truststorePass="zljzlj" / > 
참고:

server.xml의 이 내용은 원래 주석 처리되어 있습니다. https의 기본 포트 443을 사용하려면 여기에서 포트 매개변수를 수정하세요. ClientAuth="true"는 양방향 인증서 인증을 지정합니다.

2. client.p12를 브라우저의 개인 인증서 항목으로 가져옵니다.

이 때 https://127.0.0.1:8443/을 입력하면 인증서 선택이 표시됩니다. 확인을 클릭하면 계속하려면 https 페이지가 안전하지 않은지 묻는 메시지가 표시됩니다. 이제 서버가 설정되었습니다.

3.java는 서버 측을 호출하고 코드를 직접 업로드합니다.

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());
}
     }  
}

명령줄에서 직접 실행하거나 서버 측 프로젝트에서 마우스 오른쪽 버튼을 클릭하여 실행합니다. 통화가 진행되는 동안에는 로그가 인쇄됩니다. 실행 후

첨부파일을 확인해주세요.

다음 단계는 PHP에서 서버를 호출하는 것입니다. PHP의 비누 클라이언트는 DER, PEM 또는 ENG 형식의 인증서만 인식하므로 client.p12는 PHP가 사용할 수 있는 pem 파일로 변환되어야 합니다. 이 경우 openssl의 경우 먼저 cmd 명령줄을 입력하고 다음 코드를 입력하세요.

Java 코드

openssl pkcs12 -in D:\SSL\client\client.p12 -out D:\SSL\client\client-cer.pem -clcerts

프롬프트 openssl 명령이 인식되지 않으면 openssl을 설치하지 않았다는 의미입니다.실행이 성공하면 먼저 client.p12의 비밀번호를 입력하라는 메시지가 나타납니다.입력 후 내보낸 cer.pe의 비밀번호를 입력하라는 메시지가 표시됩니다. Client-cer.pem이 성공적으로 생성되었습니다! .

이제 PHP 코드를 입력하세요:

PHP 코드

$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;;

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


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.