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.
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šší
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.
Contributor
Udělte roli spravované identitě přiřazené systémem a pak nastavte přístup kscope
vašemu předplatnému.Instance služby Azure Key Vault. Pokud ho nemáte, přečtěte si článek Rychlý start: Vytvoření trezoru klíčů pomocí webu Azure Portal.
Aplikace Spring Boot. Pokud ho nemáte, vytvořte projekt Maven pomocí aplikace Spring Initializr. Nezapomeňte vybrat projekt Maven a v části Závislosti přidejte závislost Spring Web a pak vyberte Java 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 čá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:
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>
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 create
jste 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 zaz 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.
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žívejteSystem.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ámkaSsltestApplication
. - Existuje metoda s poznámkami
@GetMapping
svalue
voláním HTTP, které provedete. - Metoda
inbound
jednoduše vrátí pozdrav, když prohlížeč provede požadavek HTTPS na/ssl-test
cestu. Tatoinbound
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.
- Ve třídě vygenerované aplikací Spring Initializr je teď
Spuštěním následujících příkazů zkompilujte kód a zabalte ho do spustitelného souboru JAR.
mvn clean package
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ě.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
.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"
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
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.
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>
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); } }
Spuštěním následujících příkazů zkompilujte kód a zabalte ho do spustitelného souboru JAR.
mvn clean package
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
Spusťte aplikaci na virtuálním počítači.
set -o noglob ssh azureuser@<your VM public IP address> "java -jar *.jar"
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!!
.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.