日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多个定时器相互干扰的问题_相互问题

發布時間:2023/12/3 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多个定时器相互干扰的问题_相互问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

多個定時器相互干擾的問題

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

多個定時器相互干擾的問題

總結

以上是生活随笔為你收集整理的多个定时器相互干扰的问题_相互问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。