為您解碼網(wǎng)站建設(shè)的點(diǎn)點(diǎn)滴滴
發(fā)表日期:2019-01 文章編輯:小燈 瀏覽次數(shù):2524
在搭建Spring Cloud體系的過程中,默認(rèn)是使用非ssl(http)配置,搭建起來也相當(dāng)容易。也許是因?yàn)槭褂胹sl配置要稍復(fù)雜一些,也許是因?yàn)楹芏嗳丝紤]到使用ssl效率的問題,或者又是因?yàn)閟sl證書費(fèi)用的問題,再或者是因?yàn)樽约旱墓雀杓夹g(shù)不行,總之我沒能在網(wǎng)上找到任何關(guān)于Spring Cloud SSL配置的完整示例。所以接下來,我會向大家演示一下Spring Cloud的ssl完整配置。因?yàn)槲易约旱哪芰τ邢蓿抑荒鼙WC所有的配置是我自己測試通過的,如果中間什么配置是錯誤不可取的,還希望各位大神向我指出。
在開始之前需要向大家說明一下,這個系列不是手把手的基礎(chǔ)教程,就是說我不會一步一步的向你普及spring cloud的使用,這方面已經(jīng)有很多很成熟的系統(tǒng)教程。我只是在我自己的理解的基礎(chǔ)上,補(bǔ)充一些網(wǎng)上沒有或者很少出現(xiàn)的一些東西。
首先我們從eureka開始。為什么從它開始,是因?yàn)閹缀跛械膕pring cloud教程都會先教你從服務(wù)注冊中心搭建開始。
既然要使用ssl,那證書當(dāng)然是必不可少的,我們需要創(chuàng)建兩個證書,eureka-server.jks和eureka-client.jks。這里我們使用keytool來生成我們的認(rèn)證證書。
keytool -genkey -alias eureka-server-storetype JKS -keyalg RSA -keysize 2048 -keystore eureka-server.jks -validity 365
keytool -genkey -alias eureka-client-storetype JKS -keyalg RSA -keysize 2048-keystore eureka-client.jks -validity 365
回車鍵后會讓你輸入密碼,然后在名字與姓氏中輸入你自己的ip地址。這樣服務(wù)端和客戶端的證書就生成好了。接下來我們需要從生成的jks中導(dǎo)出公鑰證書。
keytool -export -alias eureka-server -keystore eureka-server.jks -rfc -file eureka-server.cer
keytool -export -alias eureka-client -keystore eureka-client.jks -rfc -file eureka-client.cer
這里會要求你輸入上一步你設(shè)置的密碼,執(zhí)行成功后會提示 存儲在文件 eureka-server.cer中的證書。然后把公鑰證書導(dǎo)入到truststore中:
keytool -import -alias eureka-server -trust -file eureka-server.cer -keystore eureka-server-trust.jks
keytool -import -alias eureka-client -trust -file eureka-client.cer -keystore eureka-client-trust.jks
最后將服務(wù)端與客戶端的公鑰證書導(dǎo)入到彼此的truststore中:
keytool -import -alias eureka-client-file eureka-client.cer -keystore eureka-server-trust.jks
keytool -import -alias eureka-server-file eureka-server.cer -keystore eureka-client-trust.jks
至此ssl需要的證書我們就生成好了。
構(gòu)建ssl服務(wù)發(fā)現(xiàn)中心與平常的服務(wù)發(fā)現(xiàn)中心沒有什么區(qū)別,只是會在你的配置文件中添加幾項(xiàng)配置。
首先將生成的eureka-server.jks與eureka-server-trust.jks主在resources目錄。然后在application.yml文件中做如下配置:
server: port: ${PORT:8443} ssl: enabled: true key-store: classpath:eureka-server.jks key-store-password: 你設(shè)置的密碼 trust-store: classpath:eureka-server-trust.jks trust-store-password:你設(shè)置的密碼 key-alias: eureka-server eureka: instance: #根據(jù)需要,如果只使用ssl可設(shè)置為false non-secure-port-enabled: true non-secure-port: 8080 secure-port-enabled: true secure-port: ${server.port} client: register-with-eureka: false fetch-registry: false service-url: #localhost需要修改為你證書中配置的地址 defaultZone: 'https://localhost:${server.port}/eureka/'
如果你和我一樣,啟用了non-secure-port-enabled=true,即服務(wù)注冊中心可以同時支持http與https注冊,那還需要將non-secure-port添加到端口監(jiān)聽:
@Value("${eureka.instance.non-secure-port}") privateStringnoSecurePort; @Bean publicIntegerport(){ return Integer.parseInt(noSecurePort); } @Bean publicEmbeddedServletContainerFactory servletContainer(){ TomcatEmbeddedServletContainerFactory tomcat=newTomcatEmbeddedServletContainerFactory(); tomcat.addAdditionalTomcatConnectors(createStandardConnector()); return tomcat; } privateConnector createStandardConnector(){ Connector connector=newConnector("org.apache.coyote.http11.Http11NioProtocol"); connector.setPort(port()); return connector; }
現(xiàn)在一個支持ssl的服務(wù)發(fā)現(xiàn)中心就配置好了,我的這個服務(wù)發(fā)現(xiàn)中心還同時支持http注冊。在瀏覽器中訪問一下服務(wù)發(fā)現(xiàn)中心的兩個端口,都可以正常訪問。
首先構(gòu)建一個正常的Spring Cloud客戶端應(yīng)用。也需要和配置服務(wù)發(fā)現(xiàn)中心一樣,導(dǎo)入證書密鑰庫。但這一步不太容易。因?yàn)镾pringCloud 并沒提供將證書密鑰庫傳遞給Eureka Client的方法。好在Eureka是使用Jersey實(shí)現(xiàn)服務(wù)端與客戶端之間的建立,并不是Spring RestTemplate。Spring Cloud Eureka是建立在Netflix OSS Eureka客戶端之上的,它不使用Spring庫。所以我們可以像配置Jersey SSL的方式來配置密鑰庫。但我們發(fā)現(xiàn),即使我們這樣配置好,在連接到服務(wù)注冊中心的SSL端口時,Eureka Client同樣沒有使用ssl協(xié)議。這是因?yàn)?,對于像配置ssl這樣的一些高級配置,直接靠配置文件是無法配置的,我們需要創(chuàng)建一個DiscoveryClientOptionalArgs的Bean來配置。我將通過以下代碼片斷為大家演示如何為發(fā)現(xiàn)客戶端啟用SSL連接。
首先,我們使用javax.net.ssl.* Java系統(tǒng)屬性設(shè)置密鑰庫和信任庫文件的位置。然后,我們基于Java SSL設(shè)置提供Jersey客戶端的自定義實(shí)現(xiàn),并為DiscoveryClientOptionalArgs bean設(shè)置它。
@Configuration publicclassEurekaSslConfig{ @Value("${eureka.client.service-url.defaultZone}") privateStringdefaultZone; @Bean publicDiscoveryClient.DiscoveryClientOptionalArgs discoveryClientOptionalArgs(){ DiscoveryClient.DiscoveryClientOptionalArgs args=newDiscoveryClient.DiscoveryClientOptionalArgs(); System.setProperty("javax.net.ssl.keyStore","src/main/resources/eureka-client.jks"); System.setProperty("javax.net.ssl.keyStorePassword","你的密碼"); System.setProperty("javax.net.ssl.trustStore","src/main/resources/eureka-client-trust.jks"); System.setProperty("javax.net.ssl.trustStorePassword","你的密碼"); EurekaJerseyClientImpl.EurekaJerseyClientBuilder builder=newEurekaJerseyClientImpl.EurekaJerseyClientBuilder(); builder.withClientName("eureka-client"); if(defaultZone.startsWith("https://")){ builder.withSystemSSLConfiguration(); } builder.withMaxTotalConnections(10); builder.withMaxConnectionsPerHost(10); args.setEurekaJerseyClient(builder.build()); return args; } }
配置application.yml:
eureka: client: service-url: defaultZone:'https://localhost:8443/eureka/'
啟動服務(wù)端與客戶端,查看發(fā)現(xiàn)中心頁面,一切正常。將defaultZone配置成http端口的訪問,也同樣正常注冊到服務(wù)發(fā)現(xiàn)中心。
配置Eureka的SSL主要是在客戶端配置密鑰庫那一步,通過正常的Spring Cloud的配置方式無法配置密鑰庫。
日期:2018-04 瀏覽次數(shù):6826
日期:2017-02 瀏覽次數(shù):3500
日期:2017-09 瀏覽次數(shù):3735
日期:2017-12 瀏覽次數(shù):3585
日期:2018-12 瀏覽次數(shù):4891
日期:2016-12 瀏覽次數(shù):4649
日期:2017-07 瀏覽次數(shù):13697
日期:2017-12 瀏覽次數(shù):3575
日期:2018-06 瀏覽次數(shù):4325
日期:2018-05 瀏覽次數(shù):4504
日期:2017-12 瀏覽次數(shù):3616
日期:2017-06 瀏覽次數(shù):4035
日期:2018-01 瀏覽次數(shù):4008
日期:2016-12 瀏覽次數(shù):3965
日期:2018-08 瀏覽次數(shù):4478
日期:2017-12 瀏覽次數(shù):3784
日期:2016-09 瀏覽次數(shù):6544
日期:2018-07 瀏覽次數(shù):3266
日期:2016-12 瀏覽次數(shù):3283
日期:2018-10 瀏覽次數(shù):3437
日期:2018-10 瀏覽次數(shù):3542
日期:2018-09 瀏覽次數(shù):3633
日期:2018-02 瀏覽次數(shù):3654
日期:2015-05 瀏覽次數(shù):3578
日期:2018-09 瀏覽次數(shù):3364
日期:2018-06 瀏覽次數(shù):3490
日期:2017-02 瀏覽次數(shù):3930
日期:2018-02 瀏覽次數(shù):4390
日期:2018-02 瀏覽次數(shù):4252
日期:2016-12 瀏覽次數(shù):3628
Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.