1. ホーム
  2. java

[解決済み] サーバーがHTTPレスポンスコードを返しました。401 for URL: https

2022-02-14 08:03:25

質問

Javaを使用して、XML形式で表示を返すHTTPSサイトにアクセスしています。私はURL自体でログイン認証情報を渡します。以下はコード・スニペットです。

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
requestURL = "https://Administrator:Password@localhost:8443/abcd";

try { 
    InputStream is = null;
    URL url = new URL(requestURL);
    InputStream xmlInputStream =new URL(requestURL).openConnection().getInputStream();
    byte[] testByteArr = new byte[xmlInputStream.available()];
    xmlInputStream.read(testByteArr);
    System.out.println(new String(testByteArr));
    Document doc = db.parse(xmlInputStream);
    System.out.println("DOC="+doc);
} catch (MalformedURLException e) {
} 

署名付き/未署名の証明書を検証しないプログラム内にトラストマネージャーを作成しています。しかし、上記のプログラムを実行すると、次のようなエラーが表示されます。 サーバーがHTTPレスポンスコードを返しました。401 for URL: https://Administrator:Password@localhost:8443/abcd

ブラウザで同じurlを使用すると、xmlが正しく表示されます。Javaプログラム内でこれを動作させる方法を教えてください。

どのように解決するのですか?

401はquot;Unauthorized"を意味するので、あなたの認証情報に何かあるに違いありません。

私は、ジャワの URL は、あなたが示している構文をサポートしていません。代わりにAuthenticatorを使用することができます。

Authenticator.setDefault(new Authenticator() {

    @Override
    protected PasswordAuthentication getPasswordAuthentication() {          
        return new PasswordAuthentication(login, password.toCharArray());
    }
});

を実行し、その後、認証情報なしで通常のurlを呼び出すだけです。

もう1つの方法は、ヘッダーでクレデンシャルを提供することです。

String loginPassword = login+ ":" + password;
String encoded = new sun.misc.BASE64Encoder().encode (loginPassword.getBytes());
URLConnection conn = url.openConnection();
conn.setRequestProperty ("Authorization", "Basic " + encoded);

PS: そのBase64Encoderを使用することは推奨されませんが、これは簡単な解決策を示すだけです。もし、その解決策を維持したいのであれば、そうするライブラリを探してください。たくさんあります。