3

我有一个 Java 程序,它连接到一台服务器并与该服务器交互并执行(打个招呼世界)简单的任务。

我的 java 程序是与 vmware esxi 服务器交互。使用以下代码。

ServiceInstance si = new ServiceInstance(new URL("https://10.100.13.36/sdk"), "root", "teamw0rk", true)

true 参数表示忽略证书为true。

即使它是一个 vmware 交互库,它纯粹是证书的问题。因为当我为忽略证书设置 false 时。我从库文件中得到了一般的证书期望。

程序如下。

package com.vmware.vim25.mo.samples;

import java.net.URL;
import com.vmware.vim25.*;
import com.vmware.vim25.mo.*;

public class HelloVM 
{
    public static void main(String[] args) throws Exception
    {
        long start = System.currentTimeMillis();
        ServiceInstance si = new ServiceInstance(new URL("https://10.100.13.36/sdk"), "root", "teamw0rk", false);
        long end = System.currentTimeMillis();
        System.out.println("time taken:" + (end-start));
        Folder rootFolder = si.getRootFolder();
        String name = rootFolder.getName();
        System.out.println("root:" + name);
        ManagedEntity[] mes = new InventoryNavigator(rootFolder).searchManagedEntities("VirtualMachine");
        if(mes==null || mes.length ==0)
        {
            return;
        }

        VirtualMachine vm = (VirtualMachine) mes[0]; 

        VirtualMachineConfigInfo vminfo = vm.getConfig();
        VirtualMachineCapability vmc = vm.getCapability();

        vm.getResourcePool();
        System.out.println("Hello " + vm.getName());
        System.out.println("GuestOS: " + vminfo.getGuestFullName());
        System.out.println("Multiple snapshot supported: " + vmc.isMultipleSnapshotsSupported());

        si.getServerConnection().logout();
    }

}

该错误与期待 ssl 证书有关。

Exception in thread "main" java.rmi.RemoteException: VI SDK invoke exception:javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names matching IP address 10.100.13.36 found
    at com.vmware.vim25.ws.WSClient.invoke(WSClient.java:182)
    at com.vmware.vim25.ws.WSClient.invoke(WSClient.java:124)
    at com.vmware.vim25.ws.VimStub.retrieveServiceContent(VimStub.java:1521)
    at com.vmware.vim25.mo.ServiceInstance.<init>(ServiceInstance.java:85)
    at com.vmware.vim25.mo.ServiceInstance.<init>(ServiceInstance.java:69)
    at com.vmware.vim25.mo.samples.HelloVM.main(HelloVM.java:16)

正如我确认的程序错误与 vmware 无关,它与证书有关。

我所做的第一步是使用以下命令创建 jks 文件

c:/java/jre/bin>keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass password -validity 360 -keysize 2048

它在 bin 文件夹中创建 keystore.jks。

我必须了解如何在 java 程序中引用这个 keystore.jks。(我对此知之甚少......对不起)

如何生成证书以及导入证书和导出证书的含义。

就我而言,我需要导入还是导出..

最初我发布了一个人的问题..

他回答为“在高级别上,您需要将服务器证书放入您的密钥库,并将密钥库包含在 JVM 参数中”

请澄清我的疑问并对此有所了解。

谢谢你。

4

4 回答 4

1

您收到的错误是抱怨 URL (10.100.13.36) 中的主机名与服务器 SSL 证书中包含的任何服务器名称都不匹配。

CertificateException:找不到与 IP 地址 10.100.13.36 匹配的主题备用名称

您可以在 URL 请求中使用实际的服务器名称重试吗?您可能需要使用服务器的完全限定名称。因为您需要匹配服务器正在使用的 SSL 证书中包含的服务器名称。

您可以使用 curl 命令查看服务器的证书,例如:

curl -v https://10.100.13.36/sdk

以下是 Microsoft 的 SSL 证书包含的内容:

C:\>curl -v https://www.microsoft.com
* About to connect() to www.microsoft.com port 443 (#0)
*   Trying 64.4.11.20... connected
* Connected to www.microsoft.com (64.4.11.20) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: c:\tpf$\bin\curl-ca-bundle.crt
  CApath: none
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using RC4-MD5
* Server certificate:
*        subject: C=US; ST=WA; L=Redmond; O=Microsoft Corporation; OU=MSCOM; CN=
www.microsoft.com
*        start date: 2012-03-29 19:29:53 GMT
*        expire date: 2014-03-29 19:29:53 GMT
*        common name: www.microsoft.com (matched)
*        issuer: DC=com; DC=microsoft; DC=corp; DC=redmond; CN=Microsoft Secure
Server Authority
*        SSL certificate verify ok.
> GET / HTTP/1.1
于 2012-05-31T18:26:27.563 回答
0

该证书由 Tomcat 使用,而不是您的客户端。请参阅 Tomcat SSL 文档。

于 2012-05-31T21:58:27.543 回答
0

简短的回答:

首先使用服务器的 DNS 名称而不是 IP 进行测试(这里有长解释)。

其次,如果要使用证书,则必须导入服务器证书,而不是自己生成...

于 2012-05-31T18:34:22.317 回答
0

-dname CN=10.100.13.36生成证书时尝试添加。我认为您甚至不需要使用主题备用名称。公用名 (CN) 应与您在 URL 中用于连接的域名相同。

于 2012-06-02T19:21:48.210 回答