Java和Windows-HTTPS上的身份验证问题

Java和Windows-HTTPS上的身份验证问题,java,windows,ssl,http-authentication,Java,Windows,Ssl,Http Authentication,我使用Eclipse中的默认API通过HTTPS连接到服务器。我的密钥库中安装了链接证书。但是,Windows不喜欢它,并抛出了一个证书链接错误。在Ubuntu上,它实际上工作得很好 现在,在Windows上我看到了一个“黑客”,它基本上创建了一个TrustManager,可以启用所有证书。就目前而言,这很好。稍后我将不得不返回到它,但是,我当前的问题是我的代码连接到服务器,使用uc.setRequestProperty(“Authorization”,“Basic”+encodedLogin)

我使用Eclipse中的默认API通过HTTPS连接到服务器。我的密钥库中安装了链接证书。但是,Windows不喜欢它,并抛出了一个
证书链接错误
。在Ubuntu上,它实际上工作得很好

现在,在Windows上我看到了一个“黑客”,它基本上创建了一个
TrustManager
,可以启用所有证书。就目前而言,这很好。稍后我将不得不返回到它,但是,我当前的问题是我的代码连接到服务器,使用
uc.setRequestProperty(“Authorization”,“Basic”+encodedLogin)进行身份验证
但是返回表单的HTML代码,我实际上认为我是在第一时间登录的。没有那一行,我得到一个
403

当我在浏览器中访问该站点时,会弹出一个登录框。当我登录时,它让我登录没有问题。当我点击
Cancel
并取消登录框时,代码返回的正是HTML表单。因此,要么我需要以某种方式登录到这个弹出框,要么我需要第二次身份验证才能登录到web表单。我希望这是一个足够清楚的解释

我的最终目标显然是登录并将auth对象返回到我的代码中,以便与站点进行进一步通信。我只是在这个小地方呆了好几天!非常感谢您的帮助

我已经附上了我的代码,以及HTML表单的代码

谢谢

我的代码:

try
{
    String login = "MyUser:MyPass";
    byte[] encodedLogin = new Base64().encode(login.getBytes());

    StringBuilder parsedContentFromUrl = new StringBuilder();
    HttpsURLConnection uc = (HttpsURLConnection) webURL.openConnection();

    //uc.setRequestProperty("Proxy-Authorization", "Basic " + encodedLogin);
    uc.setRequestProperty("Authorization", "Basic " + encodedLogin);
    //uc.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
    uc.connect();

    //uc.getInputStream();

    BufferedInputStream in = new BufferedInputStream(uc.getInputStream());
    //System.out.println(uc.getRequestProperty("WWW-Authenticate"));

    int ch;
    while ((ch = in.read()) != -1) {
       parsedContentFromUrl.append((char) ch);
    }
    System.out.println(parsedContentFromUrl);
}
catch (IOException e)
{
    System.out.println("IOException::"+e.getMessage());
    e.printStackTrace();
}
HTML网页表单

<FORM METHOD=POST ACTION="/mylogin.form">
<FONT SIZE="+2">
<TABLE BORDER="0" WIDTH="400">
<TR>
<TD ALIGN="LEFT"><UL><LI>Username</LI></UL></TD>
<TD><INPUT NAME="username" SIZE="15"></TD>
</TR>
<TR>
<TD ALIGN="LEFT"><UL><LI>Password</LI></UL></TD>
<TD><INPUT TYPE="PASSWORD" NAME="password" SIZE="15"></TD>
</TR>
</TABLE>
</FONT>

<INPUT TYPE="HIDDEN" NAME="login-form-type" VALUE="pwd">

<BR><INPUT TYPE="SUBMIT" VALUE="Login">
</FORM>

  • 用户名
    • 密码

HTTP授权与登录web表单不同

您已经获得了HTTP授权(即,修复了403错误),因此您将获得您请求的页面,这是一个登录页面。HTML向您显示,为了登录表单,您需要在/mylogin.formURL上执行POST。目前,您正在对登录页面的URL进行获取


一台服务器有两个不同的并行身份验证过程是不常见的。服务器可能配置错误。

证书链是从有效的证书颁发机构到其下的特定实例的链。例如,Verisign、谁在公司证书上签名、谁在B部分证书上签名、谁在您的证书上签名。因此,任何符合标准的应用程序都会让你意识到由于这一点而遭到拒绝。谢谢你的评论,但我的代码在Ubuntu上运行。据我所知,我的问题的这一部分是Windows keytool/keystore问题。下周我可能会回顾一下。仅供参考,这是正确的。服务器需要2个具有相同详细信息的单独登录。在浏览器上,您只需登录一次,它就会将其转发到您的浏览器上。但我不知道如何在我的程序中做到这一点,所以我只做了两次,第二次是在表单帖子中。