Java キーストアは SSL 双方向認証を実装します [クライアントは php と java]

巴扎黑
リリース: 2016-11-09 14:30:51
オリジナル
2209 人が閲覧しました

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 コード お気に入りのコード
maxThreads="150" スキーム="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 の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(&#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;;
ログイン後にコピー

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


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート