1. まずサーバー側の環境を構築します:
準備作業: tomcat6、jdk7、openssl、javawebservice テスト プロジェクト
2. 構築プロセス:
参考 http://blog.csdn.net/chow__zh/article/詳細/ 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=北京,ST=北京,C=CN" -validity 3650 -storepass zljzlj -keypass zljzlj
注:
keytool は、JDK によって提供される証明書生成ツールです。すべてのパラメーターの使用方法については、keytool –help を参照してください。
-genkey 新しい証明書を作成します
-v の詳細
-alias 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 は、発行後のアクセス ドメイン名と一致している必要があります。ただし、証明書を独自に発行しているため、ブラウザでアクセスすると警告が表示されます。
-validity 3650 証明書の有効期間 (日数)
-storepass zljzlj 証明書のアクセスパスワード
-keypass zljzlj 証明書の秘密鍵
1.2 クライアント証明書を生成する
コマンドを実行する:
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" ‐有効性 3650 ‐ストアパスクライアント ‐キーパスクライアント
説明:
パラメータの説明は上記と同じです。ここでの -dname 証明書発行者の ID は、以前のものとは異なる場合があります。これまでのところ、これら 2 つの証明書には関係がありません。次にやるべきことは、両者の間に信頼関係を確立することです。
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 のsoapClient は DER、PEM、または ENG 形式の証明書のみを認識するため、この時点で client.p12 を PHP が認識できる pem ファイルに変換する必要があります。まず、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 '>>>>>>>>>>>';
直接运行,也会出现附件中的结果,打完收工,憋了我整整三天时间,终于搞定了。