Freigeben über


Upload a service certificate to Azure VM using Azure SDK Java code

If you want to programmatically upload a service certificate to the Azure VM without remotely logging into the VM, you can use the following Java program template to achieve it. This is useful when you want to upload multiple certificate at same time and do not want to do it manually.

Prerequisite - Azure sdk for Java.

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import com.microsoft.windowsazure.Configuration;
import com.microsoft.windowsazure.core.OperationStatusResponse;
import com.microsoft.windowsazure.core.utils.KeyStoreType;
import com.microsoft.windowsazure.exception.ServiceException;
import com.microsoft.windowsazure.management.compute.ComputeManagementClient;
import com.microsoft.windowsazure.management.compute.ComputeManagementService;
import com.microsoft.windowsazure.management.compute.models.CertificateFormat;
import com.microsoft.windowsazure.management.compute.models.ServiceCertificateCreateParameters;
import com.microsoft.windowsazure.management.compute.models.ServiceCertificateListResponse;
import com.microsoft.windowsazure.management.configuration.ManagementConfiguration;
import com.sun.mail.iap.ByteArray;

public class VMUploadCertificate {
 
 static String uri = "https://management.core.windows.net/";
 static String subscriptionId = "<your subscription Id>";
 static String keyStoreLocation = "<Your management certificate jks file path>";
 static String keyStorePassword =  "<Keystore password>";

 public static void main(String[] args) throws IOException, URISyntaxException {
  
  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 key store
           );
  
  // create a management client to call the API
  ComputeManagementClient client = ComputeManagementService.create(config);
  
  try {
            ServiceCertificateListResponse serviceCertificateListResponse = client.getServiceCertificatesOperations().list("<serviceName>");
            for ( ServiceCertificateListResponse.Certificate certificate : serviceCertificateListResponse.getCertificates()) {
                   System.out.println("Cert URI  = "+certificate.getCertificateUri().toString() );
                   System.out.println("Thumprint = "+certificate.getThumbprint());
            }
           
           
            // loop on certificats to upload   
            File folder = new File("C:\\certificates");
            try {
                   for (File file : folder.listFiles() ) {
                        if ( file.isFile() && file.getName().endsWith(".pfx") ) {
     //  if ( file.isFile() && file.getName().endsWith(".cer") ) {                                                                                             // .cer specific
                           System.out.println("File " + file.getPath());
     // Add Service Certificate                          
                                 ServiceCertificateCreateParameters serviceCertificateCreateParameters = new ServiceCertificateCreateParameters();
                               serviceCertificateCreateParameters.setCertificateFormat(CertificateFormat.Pfx);
     //         serviceCertificateCreateParameters.setCertificateFormat(CertificateFormat.Cer);                                      // .cer specific
                                
                                 //String base64Key = null;                                                                                                           // .cer specific
                                 byte [] byteKey = null;
                                 try {
                                        FileInputStream fis = new FileInputStream(file.getPath());
                                        int size = fis.available();
                                        byteKey = new byte[size];
                                        fis.read(byteKey);
                                        fis.close();
                                        // base64Key = javax.xml.bind.DatatypeConverter.printBase64Binary(byteKey);                 // .cer specific
                                 } catch(Exception e) {
                                        System.out.println("Cannot retrieve key." + file.getPath());
                                 }
                                
                                 //byte [] byteKey2 = base64Key.getBytes();                                                                                // .cer specific
                                 serviceCertificateCreateParameters.setData(byteKey );
                                 serviceCertificateCreateParameters.setPassword("<.pfx password>");                                     // .pfx specific
                                 OperationStatusResponse operationStatusResponse = client.getServiceCertificatesOperations().create("<serviceName>", serviceCertificateCreateParameters);
                                 System.out.println(operationStatusResponse);
                          }
                   }
                         
            } catch ( SecurityException e ) {
                   System.out.println("Cannot retrieve files." + e.getMessage());
            }

           
           
            serviceCertificateListResponse = client.getServiceCertificatesOperations().list("<serviceName>");           
            for ( ServiceCertificateListResponse.Certificate certificate : serviceCertificateListResponse.getCertificates()) {
                   System.out.println("Thumprint = "+certificate.getThumbprint());
            }
           
           
      } catch (Exception e) {           
            e.printStackTrace();
      }

 }

}

 

You'll have to modify the code according to the certificate type. If the certificate is ".cer" uncomment out few of the lines and you are good to go.