Sdílet prostřednictvím


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. Se Springem na Azure se certifikáty nenainstalují lokálně. 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 na Azure.

Diagram znázorňující interakci prvků v tomto kurzu

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

  • Předplatné Azure – vytvořte si ho zdarma.

  • Podporovaná sada Java Development Kit (JDK) s verzí 11.

  • Apache Maven verze 3.0 nebo vyšší.

  • Azure CLI.

  • cURL nebo podobný nástroj HTTP pro testování funkčnosti.

  • Instance virtuálního počítače Azure. Pokud ho nemáte, použijte příkaz az vm create a image Ubuntu poskytovanou UbuntuServerem k vytvoření instance virtuálního počítače s povolenou spravovanou identitou přiřazenou systémem. Udělte Contributor roli spravované identitě přiřazené systémem a pak nastavte přístup scope k vašemu předplatnému.

  • Instance služby Azure Key Vault. Pokud ho nemáte, přečtěte si Rychlý start: Vytvoření trezoru klíčů pomocí webu Azure Portal.

  • Aplikace Spring Boot. Pokud ho nemáte, vytvořte projekt Maven pomocí Spring Initializr. Nezapomeňte vybrat projektu Maven a v části Závislostípřidejte závislost Spring Web a pak vyberte Javu verze 8 nebo vyšší.

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 tématu 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 jste virtuálnímu počítači 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

Spropitné

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ádět načtení akce pro certifikát TLS/SSL, jak je uvedeno na začátku kurzu. Následující tabulka popisuje hodnoty vlastností.

    Nemovitost Popis
    server.ssl.key-alias Hodnota argumentu --name, který jste předali az keyvault certificate create.
    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 systémové proměnné.

    Jediná vlastnost specifická 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, aby prováděla akce 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 přítomnou akci uvedenou na začátku tohoto kurzu . Následující seznam obsahuje několik podrobností o tomto kódu:

    • Existuje teď poznámka @RestController ke třídě SsltestApplication vygenerované aplikací Spring Initializr.
    • Existuje metoda anotovaná pomocí @GetMapping, přičemž value je specifikace pro HTTP volání, které provedete.
    • Metoda inbound jednoduše vrátí pozdrav, když prohlížeč odešle požadavek HTTPS na cestu /ssl-test. Metoda inbound ukazuje, jak server do prohlížeče prezentuje certifikát TLS/SSL.
    • Metoda exit způsobí ukončení prostředí JVM při vyvolání. Tato metoda je užitečná, aby se ukázka dala snadno spustit v kontextu tohoto tutoriálu.
  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. Informace o konfiguraci pravidel skupiny zabezpečení sítě pro povolení příchozího provozu najdete v části Práce s pravidly zabezpečení čá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, použijte následující postup ke spuštění na virtuálním počítači a volání koncového bodu REST s 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. Použijte cestu exit k ukončení serveru a zavření síťových zásuvek.

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

Teď, když jste viděli načítání akce a prezentování akce s certifikátem TLS/SSL podepsaným samotným držitelem, proveďte některé triviální změny aplikace, abyste také viděli akci přijmutí.

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 akce načtení, předloženía schválení jsou splněny prostřednictvím služby Azure Key Vault.

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

    <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 příkazu sftp 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í příkaz curl, 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. Aktivujte cestu exit k ukončení serveru a zavření síťových socketů.

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

Právě jste zaznamenali jednoduchou ilustraci akcí načíst, prezentovata přijmout s TLS/SSL certifikátem 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 služby Azure Spring Apps.

Další kroky

Další informace o Springu a Azure najdete v centru dokumentace Spring on Azure.