Azure Key Vault sertifikalarıyla Spring Boot'ta HTTPS'yi etkinleştirme
Bu öğreticide, 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 bir şekilde güvenli bir şekilde oluşturabileceğiniz gösterilmektedir.
İ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.
Ö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 - ücretsiz bir abonelik oluşturun.
Sürüm 11 ile desteklenen bir Java Development Kit (JDK).
Apache Maven sürüm 3.0 veya üzeri.
cURL veya işlevselliği test etmek için benzer bir HTTP yardımcı programı.
Bir Azure sanal makine (VM) örneği. Yoksa az vm create komutunu ve UbuntuServer tarafından sağlanan Ubuntu görüntüsünü kullanarak sistem tarafından atanan yönetilen kimlik etkin bir VM örneği oluşturun.
Contributor
Rolü sistem tarafından atanan yönetilen kimliğe verin ve ardından aboneliğinize erişimiscope
ayarlayın.Azure Key Vault örneği. Anahtarınız yoksa bkz . Hızlı Başlangıç: Azure portalını kullanarak anahtar kasası oluşturma.
Spring Boot uygulaması. Yoksa Spring Initializr ile bir Maven projesi oluşturun. Maven Projesi'ni seçtiğinizden emin olun ve Bağımlılıklar'ın altında Spring Web bağımlılığını ekleyin ve ardından Java sürüm 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 otomatik olarak imzalanan 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.
Dekont
Sertifikayı ayarladıktan sonra, Key Vault erişim ilkesi atama başlığı altında yer alan 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'yi 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:
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>
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, öğreticinin başında belirtildiği gibi Spring Boot uygulamasının TLS/SSL sertifikası için yük eylemi gerçekleştirmesini sağlar. Aşağıdaki tabloda özellik değerleri açıklanmaktadır.
Özellik Açıklama server.ssl.key-alias
öğesine iletmiş az keyvault certificate create
olduğunuz bağımsız değişkenin--name
değeri.server.ssl.key-store-type
olmalıdır AzureKeyVault
.server.ssl.trust-store-type
olmalıdır AzureKeyVault
.server.port
HTTPS bağlantılarının dinlendiği yerel TCP bağlantı noktası. azure.keyvault.uri
JSON'un vaultUri
içindeki özelliğinden döndürüraz keyvault create
. Bu değeri bir ortam değişkenine kaydettiniz.Key Vault'a özgü tek özelliktir
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, öğreticinin başında belirtildiği gibi uygulamanın TLS/SSL sertifikası için kabul etme eylemini gerçekleştirmesini sağlayacaksınız.
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); } }
System.exit(0)
Kimliği doğrulanmamış REST GET çağrısının içinden arama yalnızca tanıtım amaçlıdır. Gerçek bir uygulamada kullanmayınSystem.exit(0)
.Bu kod, bu öğreticinin başında belirtilen mevcut eylemi gösterir. Aşağıdaki listede bu kodla ilgili bazı ayrıntılar vurgulanır:
- Artık sınıfında Spring Initializr tarafından oluşturulan bir
@RestController
ek açıklamaSsltestApplication
vardır. - yaptığınız HTTP çağrısı için ile ek açıklama eklenmiş
@GetMapping
birvalue
yöntem vardır. - Bir
inbound
tarayıcı yola HTTPS isteğinde/ssl-test
bulunursa yöntemi yalnızca bir selamlama döndürür. yöntemi,inbound
sunucunun TLS/SSL sertifikasını tarayıcıya nasıl sunmayı gösterir. exit
yöntemi çağrıldığında JVM'nin çıkmasına neden olur. Bu yöntem, örneğin bu öğretici bağlamında çalıştırılmasını kolaylaştırmak için kolaylık sağlar.
- Artık sınıfında Spring Initializr tarafından oluşturulan bir
Kodu derlemek ve yürütülebilir jar dosyasına paketlemek için aşağıdaki komutları çalıştırın.
mvn clean package
içinde
<your-resource-group-name>
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 silme işleminin Güvenlik kurallarıyla çalışma bölümüne bakın.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ı oluşturduğunuza ve VM'ye yüklediğinize göre, bu uygulamayı VM'de çalıştırmak ve ile
curl
REST uç noktasını çağırmak için aşağıdaki adımları kullanın.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"
Yeni bir Bash kabuğu açın ve sunucunun TLS/SSL sertifikası sunduğunu doğrulamak için aşağıdaki komutu yürütür.
curl --insecure https://<your VM public IP address>:8443/ssl-test
exit
Sunucuyu sonlandırmak ve ağ yuvalarını kapatmak için yolu çağırın.curl --insecure https://<your VM public IP address>:8443/exit
Otomatik olarak imzalanan TLS/SSL sertifikasıyla yük ve sunum eylemlerini gördüğünüze göre, kabul eylemini de 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, mevcut ve kabul etme eylemleri Azure Key Vault'tan karşılanmıştır.
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>
adlı
ssl-test-outbound
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); } }
Kodu derlemek ve yürütülebilir jar dosyasına paketlemek için aşağıdaki komutları çalıştırın.
mvn clean package
Bu makalenin önceki bölümlerinde yer alan aynı
sftp
komutu kullanarak uygulamayı yeniden karşıya yükleyin.cd target sftp <your VM public IP address> put *.jar
Uygulamayı VM'de çalıştırın.
set -o noglob ssh azureuser@<your VM public IP address> "java -jar *.jar"
Sunucu çalıştırıldıktan sonra sunucunun TLS/SSL sertifikasını kabul ettiğini doğrulayın. Önceki
curl
komutu 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
iletisini
Outbound TLS is working!!
görmeniz gerekir.exit
Sunucuyu sonlandırmak ve ağ yuvalarını kapatmak için yolu çağırın.curl --insecure https://<your VM public IP address>:8443/exit
Artık Azure Key Vault'ta depolanan otomatik olarak imzalanan TLS/SSL sertifikasına sahip yük, mevcut ve kabul eylemlerinin basit bir çizimini gözlemlediniz.
Azure Spring Apps'e dağıtma
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 fazlasını öğrenmek için Azure’da Spring belge merkezinde çalışmaya devam edin.