Povolení HTTPS ve Spring Bootu s certifikáty služby Azure Key Vault

V tomto kurzu se dozvíte, jak zabezpečit aplikace Spring Boot (včetně Azure Spring Apps) pomocí certifikátů TLS/SSL pomocí služby Azure Key Vault a spravovaných identit pro prostředky Azure.

Aplikace Spring Boot na podnikové úrovni, ať už v cloudu nebo v místním prostředí, vyžadují komplexní šifrování síťového provozu pomocí standardních protokolů TLS. Většina certifikátů TLS/SSL, které narazíte, je zjistitelná od veřejné kořenové certifikační autority (CA). Někdy ale toto zjišťování není možné. Pokud certifikáty nejsou zjistitelné, musí mít aplikace nějaký způsob, jak takové certifikáty načíst, prezentovat je příchozím síťovým připojením a přijímat je z odchozích síťových připojení.

Aplikace Spring Boot obvykle povolují protokol TLS instalací certifikátů. Certifikáty se nainstalují do místního úložiště klíčů prostředí JVM, na kterém běží aplikace Spring Boot. S Využitím Springu v Azure se certifikáty nenainstaluje místně. Integrace Spring pro Microsoft Azure poskytuje bezpečný a bezproblémový způsob, jak povolit tls pomocí služby Azure Key Vault a spravované identity pro prostředky Azure.

Diagram showing interaction of elements in this tutorial.

Důležité

Spring Cloud Azure Certificate starter verze 4.x nebo vyšší v současné době nepodporuje tls/mTLS, pouze automaticky konfigurují klienta certifikátu služby Key Vault. Proto pokud chcete použít tls/mTLS, nemůžete migrovat na verzi 4.x.

Požadavky

Důležité

K dokončení kroků v tomto článku se vyžaduje Spring Boot verze 2.5 nebo vyšší.

Nastavení certifikátu TLS/SSL podepsaného svým držitelem

Postup v tomto kurzu platí pro všechny certifikáty TLS/SSL (včetně podepsaných svým držitelem) uložené přímo ve službě Azure Key Vault. Certifikáty podepsané svým držitelem nejsou vhodné pro použití v produkčním prostředí, ale jsou užitečné pro vývojové a testovací aplikace.

V tomto kurzu se používá certifikát podepsaný svým držitelem. Informace o nastavení certifikátu najdete v tématu Rychlý start: Nastavení a načtení certifikátu ze služby Azure Key Vault pomocí webu Azure Portal.

Poznámka:

Po nastavení certifikátu udělte virtuálnímu počítači přístup ke službě Key Vault podle pokynů v části Přiřazení zásad přístupu ke službě Key Vault.

Zabezpečené připojení prostřednictvím certifikátu TLS/SSL

Teď máte virtuální počítač a instanci služby Key Vault a udělili mu přístup ke službě Key Vault. Následující části ukazují, jak se bezpečně připojit pomocí certifikátů TLS/SSL ze služby Azure Key Vault v aplikaci Spring Boot. Tento kurz ukazuje následující dva scénáře:

  • Spuštění aplikace Spring Boot se zabezpečenými příchozími připojeními
  • Spuštění aplikace Spring Boot se zabezpečenými odchozími připojeními

Tip

V následujících krocích se kód zabalí do spustitelného souboru a nahraje se do virtuálního počítače. Nezapomeňte na virtuální počítač nainstalovat OpenJDK .

Spuštění aplikace Spring Boot se zabezpečenými příchozími připojeními

Pokud certifikát TLS/SSL pro příchozí připojení pochází ze služby Azure Key Vault, nakonfigurujte aplikaci následujícím postupem:

  1. Do souboru pom.xml přidejte následující závislosti:

    <dependency>
       <groupId>com.azure.spring</groupId>
       <artifactId>azure-spring-boot-starter-keyvault-certificates</artifactId>
       <version>3.14.0</version>
    </dependency>
    
  2. Nakonfigurujte přihlašovací údaje služby Key Vault v konfiguračním souboru application.properties .

    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>
    

    Tyto hodnoty umožňují aplikaci Spring Boot provést akci načítání pro certifikát TLS/SSL, jak je uvedeno na začátku kurzu. Následující tabulka popisuje hodnoty vlastností.

    Vlastnost Popis
    server.ssl.key-alias Hodnota argumentu --name , který az keyvault certificate createjste předali .
    server.ssl.key-store-type Musí být AzureKeyVault.
    server.ssl.trust-store-type Musí být AzureKeyVault.
    server.port Místní port TCP, na kterém se mají naslouchat připojení HTTPS.
    azure.keyvault.uri Vlastnost vaultUri ve návratovém formátu JSON z az keyvault create. Tuto hodnotu jste uložili do proměnné prostředí.

    Jedinou vlastností specifickou pro Key Vault je azure.keyvault.uri. Aplikace běží na virtuálním počítači, jehož spravovaná identita přiřazená systémem má udělený přístup ke službě Key Vault. Aplikace proto má také udělený přístup.

    Tyto změny umožňují aplikaci Spring Boot načíst certifikát TLS/SSL. V dalším kroku povolíte aplikaci provést akci přijetí pro certifikát TLS/SSL, jak je uvedeno na začátku kurzu.

  3. Upravte soubor spouštěcí třídy tak, aby byl v něm následující obsah.

    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);
        }
    
    }
    

    Volání System.exit(0) z neověřeného volání REST GET je určené jenom pro demonstrační účely. Nepoužívejte System.exit(0) v reálné aplikaci.

    Tento kód znázorňuje současnou akci uvedenou na začátku tohoto kurzu. Následující seznam obsahuje několik podrobností o tomto kódu:

    • Ve třídě vygenerované aplikací Spring Initializr je teď @RestController poznámka SsltestApplication .
    • Existuje metoda s poznámkami @GetMappings value voláním HTTP, které provedete.
    • Metoda inbound jednoduše vrátí pozdrav, když prohlížeč provede požadavek HTTPS na /ssl-test cestu. Tato inbound metoda ukazuje, jak server prezentuje certifikát TLS/SSL do prohlížeče.
    • Metoda exit způsobí, že JVM se při vyvolání ukončí. Tato metoda je pohodlná, aby se ukázka snadno spustila v kontextu tohoto kurzu.
  4. Spuštěním následujících příkazů zkompilujte kód a zabalte ho do spustitelného souboru JAR.

    mvn clean package
    
  5. Ověřte, že skupina zabezpečení sítě vytvořená v rámci <your-resource-group-name> umožňuje příchozí provoz na portech 22 a 8443 z vaší IP adresy. Další informace o konfiguraci pravidel skupiny zabezpečení sítě pro povolení příchozího provozu najdete v části Práce s pravidly zabezpečení v části Vytvoření, změna nebo odstranění skupiny zabezpečení sítě.

  6. Umístěte spustitelný soubor JAR na virtuální počítač.

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

    Teď, když jste vytvořili aplikaci Spring Boot a nahráli ji do virtuálního počítače, spusťte ji na virtuálním počítači pomocí následujícího postupu a volejte koncový bod REST pomocí curl.

  7. Připojte se k virtuálnímu počítači pomocí SSH a spusťte spustitelný soubor JAR.

    set -o noglob
    ssh azureuser@<your VM public IP address> "java -jar *.jar"
    
  8. Otevřete nové prostředí Bash a spuštěním následujícího příkazu ověřte, že server prezentuje certifikát TLS/SSL.

    curl --insecure https://<your VM public IP address>:8443/ssl-test
    
  9. exit Vyvoláte cestu k ukončení serveru a zavřete síťové sokety.

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

Teď, když jste viděli načtení a prezentaci akcí s certifikátem TLS/SSL podepsaným svým držitelem, proveďte v aplikaci několik triviálních změn, abyste viděli také akci přijetí.

Spuštění aplikace Spring Boot se zabezpečenými odchozími připojeními

V této části upravíte kód v předchozí části tak, aby certifikát TLS/SSL pro odchozí připojení pochází ze služby Azure Key Vault. Proto jsou akce načtení, prezentace a přijetí splněné ze služby Azure Key Vault.

  1. Přidejte závislost klienta Apache HTTP do souboru pom.xml :

    <dependency>
       <groupId>org.apache.httpcomponents</groupId>
       <artifactId>httpclient</artifactId>
       <version>4.5.13</version>
    </dependency>
    
  2. Přidejte nový koncový bod rest s názvem ssl-test-outbound. Tento koncový bod otevře soket TLS sám sobě a ověří, že připojení TLS přijímá certifikát TLS/SSL. Nahraďte předchozí část spouštěcí třídy následujícím kódem.

    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. Spuštěním následujících příkazů zkompilujte kód a zabalte ho do spustitelného souboru JAR.

    mvn clean package
    
  4. Znovu nahrajte aplikaci pomocí stejného sftp příkazu z dřívějšího článku.

    cd target
    sftp <your VM public IP address>
    put *.jar
    
  5. Spusťte aplikaci na virtuálním počítači.

    set -o noglob
    ssh azureuser@<your VM public IP address> "java -jar *.jar"
    
  6. Po spuštění serveru ověřte, že server přijímá certifikát TLS/SSL. Ve stejném prostředí Bash, ve kterém jste vydali předchozí curl příkaz, spusťte následující příkaz.

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

    Měla by se zobrazit zpráva Outbound TLS is working!!.

  7. exit Vyvoláte cestu k ukončení serveru a zavřete síťové sokety.

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

Právě jste zaznamenali jednoduchou ilustraci načítání, prezentace a přijímání akcí s certifikátem TLS/SSL podepsaným svým držitelem uloženým ve službě Azure Key Vault.

Nasazení do Azure Spring Apps

Teď, když máte aplikaci Spring Boot spuštěnou místně, je čas ji přesunout do produkčního prostředí. Azure Spring Apps usnadňuje nasazování aplikací Spring Boot do Azure bez jakýchkoli změn kódu. Služba spravuje infrastrukturu aplikací Spring, aby se vývojáři mohli soustředit na svůj kód. Azure Spring Apps poskytuje správu životního cyklu pomocí komplexního monitorování a diagnostiky, správy konfigurace, zjišťování služeb, integrace CI/CD, modrých zelených nasazení a dalších. Pokud chcete nasadit aplikaci do Azure Spring Apps, přečtěte si téma Nasazení první aplikace do Azure Spring Apps.

Další kroky

Pokud se chcete dozvědět více o architektuře Spring a Azure, přejděte do centra dokumentace Spring v Azure.