java - 在 Amazon SDK 上使用 NTLM 身份验证配置代理设置时出现问题

标签 java proxy amazon-ec2 cloud

我正在使用 amazon SDK 1.5.6 并尝试使用代理服务器初始化连接。 初始化成功,但是当我尝试使用 AmazonEC2Client 时,它失败并显示以下内容 错误:

Caught Exception: Status Code: 407, AWS Service: AmazonEC2, AWS Request ID: null, AWS Error Code: 407 Unauthorized, AWS Error Message: Unable to unmarshall error response (Premature end of file.) Reponse Status Code: 407 Error Code: 407 Unauthorized Request ID: null

初始化代码:

protected AmazonEC2 initAmazonSDKClient(String endpoint) {

        AWSCredentials awsCredentials =
                new BasicAWSCredentials(_account.getAccessKey(), _account.getSecretKey());
        ClientConfiguration config = getProxySettings();
        AmazonEC2 ret = CloudServicesEC2Api.getAmazonEC2Client(awsCredentials, config);
        ret.setEndpoint(endpoint);
        _endPointToAmazonEC2Client.put(endpoint, ret);

        return ret;
    }

private ClientConfiguration getProxySettings() {

        ClientConfiguration ret = new ClientConfiguration();
        String host = _proxySettings.getServer();
        if (!StringUtils.isNullOrEmpty(host )) {
            ret.setProxyHost(host );
        }
        if (!StringUtils.isNullOrEmpty(_proxySettings.getPort())) {
            ret.setProxyPort(Integer.valueOf(_proxySettings.getPort()));
        }
        String proxyUserName = _proxySettings.getUserName();
        if (!StringUtils.isNullOrEmpty(proxyUserName)) {
            ret.setProxyUsername(proxyUserName);
        }
        String proxyPassword = _proxySettings.getPassword();
        if (!StringUtils.isNullOrEmpty(proxyPassword)) {
            ret.setProxyPassword(proxyPassword);
        }
        ret.setProxyWorkstation(host );
        ret.setProxyDomain(host );

        return ret;
    }

使用客户端并导致错误的代码:

private List<InstanceStatus> getStatusChecks(AmazonEC2 ec2Client, String[] hostIds) {

        DescribeInstanceStatusRequest describeInstanceRequest =
                new DescribeInstanceStatusRequest().withInstanceIds(hostIds);
        DescribeInstanceStatusResult describeInstanceResult =
                ec2Client.describeInstanceStatus(describeInstanceRequest);

        return describeInstanceResult.getInstanceStatuses();
    }

我知道根本原因是 NTLM 身份验证,我需要以某种方式配置 NTLM 主机和 NTLM 域,在我的代码示例中其行:

ret.setProxyWorkstation(host );
ret.setProxyDomain(host );

我尝试了多个版本的工作站和域,我尝试将其留空,但没有用......

请多多指教!

最佳答案

好吧,经过一些研究,发现 Amazon SDK 处理 NTLM 代理请求的方式有些不对劲。我们比较了传递到连接成功的其他库(例如 JClouds)的代理参数,并尝试在 Amazon SDK 上应用相同的参数,但没有成功。 我们甚至使用wireshark比较了数据包,一切都是一样的。这个库有点不对劲...

关于java - 在 Amazon SDK 上使用 NTLM 身份验证配置代理设置时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20402454/

相关文章:

java - 如何在通过代理 (Tor) 浏览时阻止 Java 预解析我的主机?

grails - Grails应用程序无法在Amazon EC2中运行,但可以在Windows中正常运行

node.js - 在亚马逊 EC2 上托管 nodeJS/mongoose Web 应用程序

java - eclipse indigo 不断卡住并给出问题

java - SMTP - 通过代理发送电子邮件失败 (JAVA)

java - 如何将 HttpResponse 转发到打开的客户端套接字? (Java程序充当代理)

amazon-web-services - 无法通过 Cloudformation 创建 EC2 实例

java - 使用 split 时遇到问题

Java JPanel 绘制缩放

java - Android Studio 的 Unity 插件。