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 코드 수집 코드
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('id' => '2'); $local_cert = "./client-cer.pem"; set_time_limit(0); try{ //ini_set("soap.wsdl_cache_enabled", "0"); // disabling WSDL cache $wsdl='https://192.168.1.146:8443/pro/ws/getInfoService?wsdl'; // echo file_get_contents($wsdl); $soap=new SoapClient($wsdl, array( 'trace'=>true, 'cache_wsdl'=>WSDL_CACHE_NONE, 'soap_version' => SOAP_1_1, 'local_cert' => $local_cert, //client证书信息 'passphrase'=> 'client', //密码 // 'allow_self_signed'=> true ) ); $result=$soap->sayHello($params); $result_json= json_encode($result); $result= json_decode($result_json,true); echo '结果为:' . json_decode($result['return'],true); }catch(Exception $e) { $result['success'] = '0'; $result['msg'] = '请求超时'; echo $e->getMessage(); } echo '>>>>>>>>>>>';
直接运行,也会出现附件中的结果,打完收工,憋了我整整三天时间,终于搞定了。