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.
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. Udělte
Contributor
roli spravované identitě přiřazené systémem a pak nastavte přístupscope
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:
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á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ředaliaz 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 zaz 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.
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 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
. Metodainbound
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.
- Existuje teď poznámka
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. 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ě.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
.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
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.
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>
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 příkazu
sftp
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í 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!!
.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.