尝试了基本的位置检索器代码(如下所示)
String uri = "https://management.core.windows.net/"; String subscriptionId = "XXXXXXXX-5fad-XXXXXX-9dfa-XXXXXX"; String keyStoreLocation = "D:\\test.jks"; String keyStorePassword = "123456"; Configuration config = ManagementConfiguration.configure( new URI(uri), subscriptionId, keyStoreLocation, // the file path to the JKS keyStorePassword, // the password for the JKS KeyStoreType.jks // flags that I'm using a JKS keystore ); ManagementClient client = ManagementService.create(config); // get the list of regions LocationsListResponse response = client.getLocationsOperations().list(); ArrayList<Location> locations = response.getLocations(); // write them out for( int i=0; i<locations.size(); i++){ System.out.println(locations.get(i).getDisplayName()); }
而且效果很好。但是当我尝试创建ComputeManagementClient并尝试重新启动VM时
ComputeManagementClient computeManagementClient = ComputeManagementService.create(config); VirtualMachineOperations virtualMachinesOperations= computeManagementClient.getVirtualMachinesOperations(); virtualMachinesOperations.restart("SQLVM", "sqlvm.cloudapp.net");
我收到证书错误。
Exception in thread "main" java.util.concurrent.ExecutionException: com.microsoft.windowsazure.exception.ServiceException: ForbiddenError: The server failed to authenticate the request. Verify that the certificate is valid and is associated with this subscription. at java.util.concurrent.FutureTask.report(FutureTask.java:122) at java.util.concurrent.FutureTask.get(FutureTask.java:188) at com.microsoft.azure.management.compute.VirtualMachineOperationsImpl.restart(VirtualMachineOperationsImpl.java:9973) at com.microsoft.azure.compute.RestartVMExample.main(RestartVMExample.java:84)
PS:我从Java Keystore创建了一个.cer,然后毫无问题地上传到Azure。
有什么线索吗?
此问题是由于使用了不正确的Azure Java SDK库引起的。当我在下面的文件pom.xml中使用Maven依赖项时,我重现了相同的异常。
<dependency> <groupId>com.microsoft.azure</groupId> <artifactId>azure-mgmt-compute</artifactId> <version>0.8.3</version> </dependency>
提供VM重新启动功能的库需要两个参数:resource group name和vm name。但是库的API azure-mgmt- compute用于Azure资源管理。
resource group name
vm name
azure-mgmt- compute
若要重新启动VM,azure-svc-mgmt-compute如果使用了JKS证书,则需要使用库的API 进行Azure Service Management。类VirtualMachineOperations提供同名函数restart需要三个参数:service name,deployment name和vm name。您可以从Azure门户上的Cloud Service仪表板中找到这些名称。在您的问题代码中,vm name应当为“ sqlvm”。
azure-svc-mgmt-compute
VirtualMachineOperations
restart
service name
deployment name
正确的maven pom.xml用于依赖关系,如下所示:
<dependency> <groupId>com.microsoft.azure</groupId> <artifactId>azure-svc-mgmt</artifactId> <version>0.8.3</version> </dependency> <dependency> <groupId>com.microsoft.azure</groupId> <artifactId>azure-svc-mgmt-compute</artifactId> <version>0.8.3</version> </dependency>
和下面的代码
virtualMachinesOperations.restart("<service name: sqlvm>", "<deployment name: sqlvm>", "<vm name: sqlvm>");
通过在路径JAVA_HOME / bin中使用Java Keytool进行genkeypair的以下步骤:
keytool -genkeypair -alias keyfile -keyalg RSA -keystore <KeyStore.jks> -keysize 2048 -storepass "<password>" keytool -v -export -file <KeyStore.cer> -keystore KeyStore.jks -alias keyfile
我的代码:
String uri = "https://management.core.windows.net/"; String subscriptionId = "<subscription_id>"; String keyStoreLocation = "KeyStore.jks"; String keyStorePassword = "<password>"; Configuration config = ManagementConfiguration.configure( new URI(uri), subscriptionId, keyStoreLocation, // the file path to the JKS keyStorePassword, // the password for the JKS KeyStoreType.jks // flags that I'm using a JKS keystore ); ComputeManagementClient computeManagementClient = ComputeManagementService.create(config); VirtualMachineOperations virtualMachinesOperations = computeManagementClient.getVirtualMachinesOperations(); virtualMachinesOperations.restart("petercore", "petercore", "petercore");