Aracılığıyla paylaş


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

Bu öğretici, 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 hale getirebileceğinizi göstermektedir.

İ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.

Bu öğreticideki öğelerin etkileşimini gösteren diyagram.

Ö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

  • Azure aboneliği - ücretsizoluşturun.

  • Sürüm 11 ile desteklenen Java Development Kit (JDK).

  • Apache Maven sürüm 3.0 veya üzeri.

  • Azure CLI.

  • İşlevselliği test etmek için cURL veya benzer bir HTTP yardımcı programını .

  • Bir Azure sanal makine (VM) örneği. Eğer bir tane yoksa, az vm create komutunu ve UbuntuServer tarafından sağlanan Ubuntu görüntüsünü kullanarak, sistem tarafından atanan yönetilen kimliği etkinleştirilmiş bir VM örneği oluşturun. Sistem tarafından atanan yönetilen kimliğe Contributor rolünü verin ve ardından aboneliğinize erişim için scope'i ayarlayın.

  • Azure Key Vault örneği. Eğer bir anahtar kasanız yoksa, Hızlı Başlangıç: Azure portalını kullanarak anahtar kasası oluşturmabölümüne bakın.

  • Spring Boot uygulaması. Eğer yoksa, Spring Initializrile bir Maven projesi oluşturun. Maven Project seçtiğinizden emin olun ve Bağımlılıklaraltında Spring Web bağımlılığını ekleyin , ardından Java versiyon 8 veya üzerini seçin.

Ö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 kendi kendine imzalanmış 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.

Not

Sertifikayı ayarladıktan sonra, Key Vault erişim ilkesi atamaiçindeki 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 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, eğitimin başında bahsedildiği gibi Spring Boot uygulamasının yükleme eylemini TLS/SSL sertifikası için gerçekleştirmesini sağlar. Aşağıdaki tabloda özellik değerleri açıklanmaktadır.

    Mülk Açıklama
    server.ssl.key-alias --name argümanını az keyvault certificate create'e geçirdiğiniz değeri içindir.
    server.ssl.key-store-type AzureKeyVaultolmalıdır.
    server.ssl.trust-store-type AzureKeyVaultolmalıdır.
    server.port HTTPS bağlantılarının dinlendiği yerel TCP bağlantı noktası.
    azure.keyvault.uri vaultUri'den döndürülen JSON'daki az keyvault create özelliği. Bu değeri bir ortam değişkenine kaydettiniz.

    Key Vault'a özgü tek özellik 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, eğitimin başlangıcında belirtildiği gibi uygulamanın TLS/SSL sertifikası için eylemini kabul etmesini 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);
        }
    
    }
    

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

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

    • Artık Spring Initializr tarafından oluşturulan @RestController sınıfında SsltestApplication bir ek açıklama bulunmaktadır.
    • @GetMappingile açıklamalı bir yöntem vardır, yaptığınız HTTP çağrısı için value ile.
    • inbound yöntemi, tarayıcı /ssl-test yoluna HTTPS isteğinde bulunursa yalnızca bir selamlama döndürür. inbound yöntemi, sunucunun TLS/SSL sertifikasını tarayıcıya nasıl sunmadığını gösterir.
    • exit yöntemi çağrıldığında JVM'nin çıkmasına neden olur. Bu yöntem, bu öğretici bağlamında örneği çalıştırmayı kolaylaştırmak için bir rahatlık sunar.
  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. <your-resource-group-name> içinde 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 silmeGü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ı derleyip VM'ye yüklediğinize göre, bunu VM'de çalıştırmak ve curlile REST 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 çalıştırın.

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

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

Şimdi yük işlemini ve kendi imzalı TLS/SSL sertifikasıyla sunum eylemlerini gördüğünüze göre, kabul eylemini 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, sunmave kabul etme eylemleri Azure Key Vault'tan sağlanı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. ssl-test-outboundadlı yeni 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 komutunu 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 komutunu 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
    

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

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

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

yüklemesinin basit bir çizimini gözlemlediniz sunuyor ve Azure Key Vault'ta depolanan otomatik olarak imzalanan TLS/SSL sertifikasıyla eylemleri kabul .

Azure Spring Apps'e Yayınla

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 fazla bilgi edinmek için Azure'da Spring belge merkezine geçin.

Spring geliştiricileri için Azure Spring Cloud Azure Key Vault sertifika örnekleri