2017-08-14 8 views
0

私は証明書に関してかなり無知ですが、私が間違っていることについては助言をいただきたいと思います...残念なことに、StackOverflowの残りの部分またはWeb上の他の部分で解決策を見つけることができませんでした。Javaから証明書を要求するURLにアクセスする

レスポンスを取得するURL(HTTPSを使用)があります。 (私の場合の画像が、私はそれはそれほど重要だと確信しています)

は、ここに私がやったことだ:

1. HTTPコード403と、Webブラウザ

それ応答からURLへのアクセス「禁断の」 。

URLにアクセスするために必要な証明書(* .pfxファイル)が提供されています。

2.証明書をインストールし、PFXファイルにブラウザ

ダブルクリックから再試行するには、「証明書のインポートウィザード」(Windowsの10)を開きます。続けて再起動してください。

ここでChromeはリソースの詳細を取得します。 Firefoxにはまだ403が表示されているので、[オプション]> [詳細]> [証明書]> [証明書を表示]の順にクリックします。今度は、FFもリソースを正常に返します。 JVM

下に証明書をインストールする

3.私は今、Javaを使用して同じURLを呼びたいです。私はまだレガシー目的のためにこのプロジェクトのJava 7を使用しています。私は、keytool CLIコマンドを使用して、証明書をJavaキーストアにインポートする必要があることを理解しています。しかし、このコマンドはDER X509形式の証明書を必要とします。だから、私は再びこの形式にクロムからの証明書をエクスポートします。 keytool -import -alias MY_ALIAS -keystore C:/PROGRA~1/Java/jdk1.7.0_80/jre/lib/security/cacerts -file my_cert.cer

keytool -list -v -keystore C:/PROGRA~1/Java/jdk1.7.0_80/jre/lib/security/cacertsを行い、必要な証明書の包含のために検査:

は今のコマンドを実行します。

今、私は私のJavaプログラムを実行します。

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.InetSocketAddress; 
import java.net.Proxy; 
import java.net.URL; 
import java.net.URLConnection; 

public class TestUrlRead {  
    private static final String PROXY_URL = ...; 
    private static final int PROXY_PORT = ...; 
    private static final String IMAGE_URL = ...; 

    public static void main(String[] args) throws Exception { 
     Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_URL, PROXY_PORT)); 
     URL url = new URL(IMAGE_URL); 
     URLConnection con = url.openConnection(proxy); 
     con.setDoOutput(true); 
     con.connect(); 
     InputStream webIn = con.getInputStream(); // <-- causes IOException 
     // read and use webIn 
     inReader.close(); 
    } 
} 

スローされた例外がある:

Exception in thread "main" java.io.IOException: Server returned HTTP response code: 403 for URL: ... 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1627) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254) 
    at TestUrlRead.main(TestUrlRead.java:33) 

応答とタイミングはこれが証明書なしでブラウザに似ていることを示唆しています。私は間違って何をしていますか?

+0

UrlConnectionのキーストアを構成する必要があります。 https://stackoverflow.com/questions/3734613/how-to-request-a-url-that-requires-a-client-certificate-for-authentication – pedrofb

答えて

0

私はこの形式に再び証明書をChromeからエクスポートします。

この時点で、.pfxファイルに含まれていた秘密鍵が失われたため、サーバーに証明書を送信できませんでした。 .pfxファイルをPKCS12と入力するか、実際にはjavax.net.ssl.keyStore/keyStoreType/keyStorePasswordで直接使用する必要があります。その方法については、this questionを参照してください。

+0

秘密鍵が含まれている様子を理解できませんでした。 PFXではなくCERファイルにあります。私はあなたの提案のおかげで、タイプPKCS12の元のPFXファイルを指すことによってサンプルコードを実行することができました。 – fr13d

+1

これは簡単です:プライベートキーはPFXには含まれていますが、CERファイルには含まれていません。 PFXファイルはキーストアであり、CERファイルは証明書のみです。証明書は、公開鍵のラッパーです。秘密鍵は別個です。 – EJP

関連する問題