多个定时器相互干扰的问题_相互问题
多個定時器相互干擾的問題
HTTPS協議是建立安全連接的公認標準。 理解此協議的工作原理不是問題,并且自2000年以來可以使用相應的RFC文檔 。
盡管HTTPS的使用如此廣泛,但您仍然可以找到沒有不必要的復雜性就無法處理此協議的軟件。 不幸的是,在使用該語言進行相互身份驗證的過程中遇到了一些問題,這些都不會讓我感到驚訝。 它是Java 。
HTTPS如何工作?
在描述實現過程中遇到的問題之前,我將描述相互認證的工作原理。 HTTPS協議使用TLS / SSL協議來保護連接。 TLS / SSL協議定義了身份驗證握手,該握手允許以安全方式將任何客戶端與服務器連接。 在握手過程中,執行以下步驟:
- 客戶端發送消息以啟動連接。
- 服務器將其證書發送給客戶端。
- 客戶端使用受信任的權威機構頒發的證書來驗證證書。
- 服務器發送對客戶端證書的請求。
- 客戶端將其證書發送到服務器。
- 服務器驗證客戶端的證書。
- 服務器和客戶端交換在數據加密期間使用的主密鑰。
- 建立連接。
我們和隊友一起嘗試用Java實現HTTPS客戶端。 結合我們對TLS / SSL握手的知識和來自curl的手動測試的經驗,我們假設實現客戶端僅需要三個文件: 一個客戶端的證書 , 一個客戶端的私鑰和一個用于驗證服務器證書的受信任證書 。
哦,我們這么認為是多么錯誤。
Java –問題,解決方案以及為什么如此困難
由于每天使用相互身份驗證是很不常見的,因此我們要求世界上最好的消息來源提供少量幫助。 初看Google叔叔提供的結果并沒有揭示實現背后的復雜性,但是每次點擊結果都使我們找到了越來越混亂的解決方案(其中一些是90年代的解決方案)。 更糟糕的是,我們不得不使用Apache HttpComponents來實現我們的連接,但是大多數提議的解決方案都基于純Java庫。
來自互聯網的知識使我們能夠確定:
- Java不能直接使用任何證書或私鑰(例如curl )
- Java需要單獨的文件( Java Keystores ),其中可以包含原始證書和密鑰。
- 我們需要一個受信任的密鑰庫,其中包含每個HTTPS連接的服務器證書驗證所需的證書。
- 我們需要一個密鑰密鑰庫,其中包含客戶端的證書和客戶端的私鑰以進行相互認證。
首先,我們必須創建受信任的密鑰庫。 我們使用keytool命令使用證書創建了密鑰庫:
$ keytool -import -alias trusted_certificate -keystore trusted.jks -file trusted.crt我們將證書trusted.crt存儲在密鑰庫文件trusted.jks中,別名為trusted_certificate 。 在執行此命令期間,要求我們輸入此密鑰庫的密碼。 我們稍后使用此密碼來訪問密鑰庫文件。
要創建密鑰庫,需要執行一些其他步驟。 在大多數情況下,您可能會從公司獲得兩個文件,這些文件會頒發客戶的證書。 第一個文件是pem格式的客戶證書。 該證書將被發送到服務器。 第二個文件是客戶端的私鑰(也是pem格式),在握手過程中使用該私鑰來確認您是客戶端證書的所有者。
不幸的是, Java僅支持PKCS12格式。 因此,我們必須將證書和私鑰轉換為PKCS12格式。 我們可以使用OpenSSL做到這一點。
$ openssl pkcs12 -export \-in client.crt \-inkey client.key \-out key.p12 \-name client我們從文件client.crt和client.key生成了文件key.p12 。 再次需要輸入密碼。 此密碼用于保護私鑰。
通過將PKCS12導入新的密鑰庫,可以從PKCS12格式的文件中生成另一個密鑰庫:
$ keytool -importkeystore \-destkeystore key.jks \-deststorepass <<keystore_password>> \-destkeypass <<key_password_in_keystore>> \-alias client \-srckeystore key.p12 \-srcstoretype PKCS12 \-srcstorepass <<original_password_of_PKCS12_file>>這個命令看起來有點復雜,但是解密起來卻很容易。 在命令的開頭,我們聲明名為key.jks的新密鑰庫的參數。 我們定義了密鑰庫的密碼和此密鑰庫將使用的私鑰的密碼。 我們還將私鑰分配給密鑰庫中的某些別名(在本例中為client )。 接下來,我們指定源文件( key.p12 ),該文件的格式和原始密碼。
使用trusted.jks和key.jks我們已經準備好進行編碼。 第一步,我們必須描述我們如何使用密鑰庫。
File trustedKeystoreFile = new File("trusted.jks"); File keystoreFile = new File("key.jks");SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(trustedKeystoreFile, "<<trusted_keystore_password>>".toCharArray()).loadKeyMaterial(keystoreFile, "<<keystore_password>>".toCharArray(), "<<original_password_of_PKCS12_file>>".toCharArray()).build();SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslcontext,new String[]{"TLSv1.2"},null,SSLConnectionSocketFactory.getDefaultHostnameVerifier());我們獲取了密鑰庫文件,并構建了SSL上下文。 接下來,我們創建了套接字工廠,該套接字工廠為我們的請求提供了正確的HTTPS連接。
最后,我們可以從Java調用端點:
try (CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build()) {HttpGet httpGet = new HttpGet("https://ourserver.com/our/endpoint");try (CloseableHttpResponse response = httpclient.execute(httGet)) {HttpEntity entity = response.getEntity();System.out.println(response.getStatusLine());EntityUtils.consume(entity);} }做完了 在創建了兩個額外的文件(密鑰庫)之后,這些文件等效于我們的原始證書和私鑰,我們使用Java實現了相互身份驗證 。 用Java實現HTTPS連接也許有一定道理,但是現在這只是一個頭痛的事情。
翻譯自: https://www.javacodegeeks.com/2016/03/mutual-problems-2.html
多個定時器相互干擾的問題
總結
以上是生活随笔為你收集整理的多个定时器相互干扰的问题_相互问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 应行家算法_一些行家技巧和窍门
- 下一篇: 注释嵌套注释_DIY注释