Azure Key Vault sertifikalarıyla Spring Boot'ta HTTPS'yi etkinleştirme

Bu öğreticide, Azure Key Vault ve Azure kaynakları için yönetilen kimlikler kullanarak Spring Boot (Azure Spring Apps dahil) uygulamalarınızı TLS/SSL sertifikaları ile nasıl güvenli bir şekilde güvenli bir şekilde oluşturabileceğiniz gösterilmektedir.

İster bulutta ister şirket içinde olsun üretim sınıfı Spring Boot uygulamaları, standart TLS protokollerini kullanarak ağ trafiği için uçtan uca şifreleme gerektirir. Karşınıza çıkan TLS/SSL sertifikalarının çoğu genel kök sertifika yetkilisinden (CA) bulunabilir. Ancak bazen bu bulma mümkün değildir. Sertifikalar bulunamıyorsa, uygulamanın bu tür sertifikaları yüklemek, bunları gelen ağ bağlantılarına sunmak ve giden ağ bağlantılarından kabul etmek için bir yolu olmalıdır.

Spring Boot uygulamaları genellikle sertifikaları yükleyerek TLS'yi etkinleştirir. Sertifikalar, Spring Boot uygulamasını çalıştıran JVM'nin yerel anahtar deposuna yüklenir. Azure'da Spring ile sertifikalar yerel olarak yüklenmez. Bunun yerine, Microsoft Azure için Spring tümleştirmesi, Azure Key Vault'un yardımı ve Azure kaynakları için yönetilen kimlik ile TLS'yi etkinleştirmek için güvenli ve sorunsuz bir yol sağlar.

Diagram showing interaction of elements in this tutorial.

Önemli

Spring Cloud Azure Sertifika başlangıç sürümü 4.x veya üzeri şu anda TLS/mTLS'yi desteklememektedir, yalnızca Key Vault sertifika istemcisini otomatik olarak yapılandırmaktadır. Bu nedenle, TLS/mTLS kullanmak istiyorsanız 4.x sürümüne geçiremezsiniz.

Önkoşullar

Önemli

Bu makaledeki adımları tamamlamak için Spring Boot sürüm 2.5 veya üzeri gereklidir.

Otomatik olarak imzalanan TLS/SSL sertifikası ayarlama

Bu öğreticideki adımlar, doğrudan Azure Key Vault'ta depolanan tüm TLS/SSL sertifikaları (otomatik olarak imzalananlar dahil) için geçerlidir. Otomatik olarak imzalanan sertifikalar üretimde kullanıma uygun değildir, ancak geliştirme ve test uygulamaları için kullanışlıdır.

Bu öğreticide otomatik olarak imzalanan bir sertifika kullanılır. Sertifikayı ayarlamak için bkz . Hızlı Başlangıç: Azure portalını kullanarak Azure Key Vault'tan sertifika ayarlama ve alma.

Dekont

Sertifikayı ayarladıktan sonra, Key Vault erişim ilkesi atama başlığı altında yer alan yönergeleri izleyerek Key Vault'a VM erişimi verin.

TLS/SSL sertifikası aracılığıyla güvenli bağlantı

Artık bir VM'niz ve bir Key Vault örneğine sahipsiniz ve VM'ye Key Vault'a erişim izni vermişsiniz. Aşağıdaki bölümlerde Spring Boot uygulamasında Azure Key Vault'tan TLS/SSL sertifikaları aracılığıyla güvenli bir şekilde bağlanma işlemi gösterilmektedir. Bu öğreticide aşağıdaki iki senaryo gösterilmektedir:

  • Güvenli gelen bağlantılarla Spring Boot uygulaması çalıştırma
  • Güvenli giden bağlantılarla Spring Boot uygulaması çalıştırma

Bahşiş

Aşağıdaki adımlarda kod yürütülebilir bir dosyaya paketlenir ve VM'ye yüklenir. OPENJDK'yi VM'ye yüklemeyi unutmayın.

Güvenli gelen bağlantılarla Spring Boot uygulaması çalıştırma

Gelen bağlantının TLS/SSL sertifikası Azure Key Vault'tan geldiğinde, aşağıdaki adımları izleyerek uygulamayı yapılandırın:

  1. Pom.xml dosyanıza aşağıdaki bağımlılıkları ekleyin:

    <dependency>
       <groupId>com.azure.spring</groupId>
       <artifactId>azure-spring-boot-starter-keyvault-certificates</artifactId>
       <version>3.14.0</version>
    </dependency>
    
  2. application.properties yapılandırma dosyasında Key Vault kimlik bilgilerini yapılandırın.

    server.ssl.key-alias=<the name of the certificate in Azure Key Vault to use>
    server.ssl.key-store-type=AzureKeyVault
    server.ssl.trust-store-type=AzureKeyVault
    server.port=8443
    azure.keyvault.uri=<the URI of the Azure Key Vault to use>
    

    Bu değerler, öğreticinin başında belirtildiği gibi Spring Boot uygulamasının TLS/SSL sertifikası için yük eylemi gerçekleştirmesini sağlar. Aşağıdaki tabloda özellik değerleri açıklanmaktadır.

    Özellik Açıklama
    server.ssl.key-alias öğesine iletmiş az keyvault certificate createolduğunuz bağımsız değişkenin --name değeri.
    server.ssl.key-store-type olmalıdır AzureKeyVault.
    server.ssl.trust-store-type olmalıdır AzureKeyVault.
    server.port HTTPS bağlantılarının dinlendiği yerel TCP bağlantı noktası.
    azure.keyvault.uri JSON'un vaultUri içindeki özelliğinden döndürür az keyvault create. Bu değeri bir ortam değişkenine kaydettiniz.

    Key Vault'a özgü tek özelliktir azure.keyvault.uri. Uygulama, sistem tarafından atanan yönetilen kimliğe Key Vault erişimi verilmiş bir VM üzerinde çalışıyor. Bu nedenle uygulamaya erişim de verilmiştir.

    Bu değişiklikler Spring Boot uygulamasının TLS/SSL sertifikasını yüklemesini sağlar. Sonraki adımda, öğreticinin başında belirtildiği gibi uygulamanın TLS/SSL sertifikası için kabul etme eylemini gerçekleştirmesini sağlayacaksınız.

  3. Başlangıç sınıfı dosyasını aşağıdaki içeriklere sahip olacak şekilde düzenleyin.

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @SpringBootApplication
    @RestController
    public class SsltestApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SsltestApplication.class, args);
        }
    
        @GetMapping(value = "/ssl-test")
        public String inbound(){
            return "Inbound TLS is working!!";
        }
    
        @GetMapping(value = "/exit")
        public void exit() {
            System.exit(0);
        }
    
    }
    

    System.exit(0) Kimliği doğrulanmamış REST GET çağrısının içinden arama yalnızca tanıtım amaçlıdır. Gerçek bir uygulamada kullanmayın System.exit(0) .

    Bu kod, bu öğreticinin başında belirtilen mevcut eylemi gösterir. Aşağıdaki listede bu kodla ilgili bazı ayrıntılar vurgulanır:

    • Artık sınıfında Spring Initializr tarafından oluşturulan bir @RestController ek açıklama SsltestApplication vardır.
    • yaptığınız HTTP çağrısı için ile ek açıklama eklenmiş @GetMappingbir value yöntem vardır.
    • Bir inbound tarayıcı yola HTTPS isteğinde /ssl-test bulunursa yöntemi yalnızca bir selamlama döndürür. yöntemi, inbound sunucunun TLS/SSL sertifikasını tarayıcıya nasıl sunmayı gösterir.
    • exit yöntemi çağrıldığında JVM'nin çıkmasına neden olur. Bu yöntem, örneğin bu öğretici bağlamında çalıştırılmasını kolaylaştırmak için kolaylık sağlar.
  4. Kodu derlemek ve yürütülebilir jar dosyasına paketlemek için aşağıdaki komutları çalıştırın.

    mvn clean package
    
  5. içinde <your-resource-group-name> oluşturulan ağ güvenlik grubunun IP adresinizden 22 ve 8443 bağlantı noktalarında gelen trafiğe izin verdiğinden emin olun. Ağ güvenlik grubu kurallarını gelen trafiğe izin verecek şekilde yapılandırma hakkında bilgi edinmek için Ağ güvenlik grubu oluşturma, değiştirme veya silme işleminin Güvenlik kurallarıyla çalışma bölümüne bakın.

  6. Yürütülebilir JAR dosyasını VM'ye yerleştirin.

    cd target
    sftp azureuser@<your VM public IP address>
    put *.jar
    

    Spring Boot uygulamasını oluşturduğunuza ve VM'ye yüklediğinize göre, bu uygulamayı VM'de çalıştırmak ve ile curlREST uç noktasını çağırmak için aşağıdaki adımları kullanın.

  7. SSH kullanarak VM'ye bağlanın ve yürütülebilir JAR dosyasını çalıştırın.

    set -o noglob
    ssh azureuser@<your VM public IP address> "java -jar *.jar"
    
  8. Yeni bir Bash kabuğu açın ve sunucunun TLS/SSL sertifikası sunduğunu doğrulamak için aşağıdaki komutu yürütür.

    curl --insecure https://<your VM public IP address>:8443/ssl-test
    
  9. exit Sunucuyu sonlandırmak ve ağ yuvalarını kapatmak için yolu çağırın.

    curl --insecure https://<your VM public IP address>:8443/exit
    

Otomatik olarak imzalanan TLS/SSL sertifikasıyla yük ve sunum eylemlerini gördüğünüze göre, kabul eylemini de görmek için uygulamada bazı önemsiz değişiklikler yapın.

Güvenli giden bağlantılarla Spring Boot uygulaması çalıştırma

Bu bölümde, önceki bölümdeki kodu, giden bağlantılar için TLS/SSL sertifikasının Azure Key Vault'tan gelmesi için değiştireceksiniz. Bu nedenle, yükleme, mevcut ve kabul etme eylemleri Azure Key Vault'tan karşılanmıştır.

  1. Apache HTTP istemci bağımlılığını pom.xml dosyanıza ekleyin:

    <dependency>
       <groupId>org.apache.httpcomponents</groupId>
       <artifactId>httpclient</artifactId>
       <version>4.5.13</version>
    </dependency>
    
  2. adlı ssl-test-outboundyeni bir rest uç noktası ekleyin. Bu uç nokta kendisine bir TLS yuvası açar ve TLS bağlantısının TLS/SSL sertifikasını kabul ettiğini doğrular. Başlangıç sınıfının önceki bölümünü aşağıdaki kodla değiştirin.

    import java.security.KeyStore;
    import javax.net.ssl.HostnameVerifier;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSession;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import com.azure.security.keyvault.jca.KeyVaultLoadStoreParameter;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.ResponseEntity;
    import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
    import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.ssl.SSLContexts;
    
    @SpringBootApplication
    @RestController
    public class SsltestApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SsltestApplication.class, args);
        }
    
        @GetMapping(value = "/ssl-test")
        public String inbound(){
            return "Inbound TLS is working!!";
        }
    
        @GetMapping(value = "/ssl-test-outbound")
        public String outbound() throws Exception {
            KeyStore azureKeyVaultKeyStore = KeyStore.getInstance("AzureKeyVault");
            KeyVaultLoadStoreParameter parameter = new KeyVaultLoadStoreParameter(
                System.getProperty("azure.keyvault.uri"));
            azureKeyVaultKeyStore.load(parameter);
            SSLContext sslContext = SSLContexts.custom()
                                               .loadTrustMaterial(azureKeyVaultKeyStore, null)
                                               .build();
    
            HostnameVerifier allowAll = (String hostName, SSLSession session) -> true;
            SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext, allowAll);
    
            CloseableHttpClient httpClient = HttpClients.custom()
                .setSSLSocketFactory(csf)
                .build();
    
            HttpComponentsClientHttpRequestFactory requestFactory =
                new HttpComponentsClientHttpRequestFactory();
    
            requestFactory.setHttpClient(httpClient);
            RestTemplate restTemplate = new RestTemplate(requestFactory);
            String sslTest = "https://localhost:8443/ssl-test";
    
            ResponseEntity<String> response
                = restTemplate.getForEntity(sslTest, String.class);
    
            return "Outbound TLS " +
                (response.getStatusCode() == HttpStatus.OK ? "is" : "is not")  + " Working!!";
        }
    
        @GetMapping(value = "/exit")
        public void exit() {
            System.exit(0);
        }
    
    }
    
  3. Kodu derlemek ve yürütülebilir jar dosyasına paketlemek için aşağıdaki komutları çalıştırın.

    mvn clean package
    
  4. Bu makalenin önceki bölümlerinde yer alan aynı sftp komutu kullanarak uygulamayı yeniden karşıya yükleyin.

    cd target
    sftp <your VM public IP address>
    put *.jar
    
  5. Uygulamayı VM'de çalıştırın.

    set -o noglob
    ssh azureuser@<your VM public IP address> "java -jar *.jar"
    
  6. Sunucu çalıştırıldıktan sonra sunucunun TLS/SSL sertifikasını kabul ettiğini doğrulayın. Önceki curl komutu yayımladığınız Bash kabuğunda aşağıdaki komutu çalıştırın.

    curl --insecure https://<your VM public IP address>:8443/ssl-test-outbound
    

    iletisini Outbound TLS is working!!görmeniz gerekir.

  7. exit Sunucuyu sonlandırmak ve ağ yuvalarını kapatmak için yolu çağırın.

    curl --insecure https://<your VM public IP address>:8443/exit
    

Artık Azure Key Vault'ta depolanan otomatik olarak imzalanan TLS/SSL sertifikasına sahip yük, mevcut ve kabul eylemlerinin basit bir çizimini gözlemlediniz.

Azure Spring Apps'e dağıtma

Spring Boot uygulamasını yerel olarak çalıştırdığınıza göre artık uygulamayı üretim ortamına taşımanın zamanı geldi. Azure Spring Apps , kod değişikliği yapmadan Spring Boot uygulamalarını Azure'a dağıtmayı kolaylaştırır. Hizmet, geliştiricilerin kodlarına odaklanabilmesi için Spring uygulamalarının altyapısını yönetir. Azure Spring Apps kapsamlı izleme ve tanılama, yapılandırma yönetimi, hizmet bulma, CI/CD tümleştirmesi, mavi-yeşil dağıtımlar ve daha fazlasını kullanarak yaşam döngüsü yönetimi sağlar. Uygulamanızı Azure Spring Apps'e dağıtmak için bkz . İlk uygulamanızı Azure Spring Apps'e dağıtma.

Sonraki adımlar

Spring ve Azure hakkında daha fazlasını öğrenmek için Azure’da Spring belge merkezinde çalışmaya devam edin.