ได้รับการแจ้งเตือนที่เป็นอันตราย: handshake_failure ผ่าน SSLHandshakeException


134

ฉันมีปัญหากับการเชื่อมต่อ SSL ที่ได้รับอนุญาต ฉันได้สร้าง Struts Action ที่เชื่อมต่อกับเซิร์ฟเวอร์ภายนอกด้วยใบรับรอง Client Authorized SSL ในการดำเนินการของฉันฉันพยายามส่งข้อมูลบางส่วนไปยังเซิร์ฟเวอร์ของธนาคาร แต่ไม่มีโชคเพราะฉันมีข้อผิดพลาดต่อไปนี้จากเซิร์ฟเวอร์:

error: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

My Method จากคลาส Action ของฉันที่ส่งข้อมูลไปยังเซิร์ฟเวอร์

//Getting external IP from host
    URL whatismyip = new URL("http://automation.whatismyip.com/n09230945.asp");
    BufferedReader inIP = new BufferedReader(new InputStreamReader(whatismyip.openStream()));

    String IPStr = inIP.readLine(); //IP as a String

    Merchant merchant;

    System.out.println("amount: " + amount + ", currency: " + currency + ", clientIp: " + IPStr + ", description: " + description);

    try {

        merchant = new Merchant(context.getRealPath("/") + "merchant.properties");

    } catch (ConfigurationException e) {

        Logger.getLogger(HomeAction.class.getName()).log(Level.INFO, "message", e);
        System.err.println("error: " + e.getMessage());
        return ERROR;
    }

    String result = merchant.sendTransData(amount, currency, IPStr, description);

    System.out.println("result: " + result);

    return SUCCESS;

ไฟล์ Merchant.properties ของฉัน:

bank.server.url=https://-servernameandport-/
https.cipher=-cipher-

keystore.file=-key-.jks
keystore.type=JKS
keystore.password=-password-
ecomm.server.version=2.0

encoding.source=UTF-8
encoding.native=UTF-8

เป็นครั้งแรกที่ฉันคิดว่านี่เป็นปัญหาเกี่ยวกับใบรับรองฉันแปลงจาก. pfx เป็น. jks แต่ฉันมีข้อผิดพลาดเดียวกันโดยไม่มีการเปลี่ยนแปลง


คุณได้เพิ่มใบรับรอง ssl ของเซิร์ฟเวอร์ไปยัง Truststore ของคุณหรือไม่
happymeal

ขออภัยฉันไม่เข้าใจว่านี่หมายถึงอะไรฉันเพิ่งเริ่มใช้ SSL
Denees

ฉันจะถือว่าแอปของคุณใช้ java default truststore Truststore เริ่มต้นคือ <java-home> / lib / security / cacerts เปิด url ของเซิร์ฟเวอร์ด้วยเบราว์เซอร์ของคุณและดาวน์โหลดใบรับรอง ssl ทั้งหมด รวมถึงใบรับรองโซ่ / ตัวกลางใด ๆ จากนั้นเพิ่มใบรับรองเหล่านี้ทั้งหมดลงใน truststore
happymeal

ฉันไม่สามารถเปิด url ในเบราว์เซอร์ได้เนื่องจากใบรับรองการตรวจสอบความถูกต้องของไคลเอ็นต์ฉันสามารถส่งไปยังลิงก์นี้ได้เฉพาะพารามิเตอร์ที่ฉันได้รับจากไคลเอนต์เท่านั้น
Denees

เพียงแค่เปิด url ละเว้นข้อผิดพลาดทั้งหมดที่คุณเห็นบนเบราว์เซอร์ของคุณ เมื่อคุณเข้าถึง url คุณจะเห็นไอคอนแม่กุญแจบนแถบที่อยู่ของเบราว์เซอร์ของคุณ คลิกที่และดาวน์โหลดใบรับรอง ssl ของเซิร์ฟเวอร์
happymeal

คำตอบ:


252

ความล้มเหลวในการจับมืออาจเกิดขึ้นได้จากหลายสาเหตุ:

  • ชุดการเข้ารหัสที่เข้ากันไม่ได้ที่ไคลเอ็นต์และเซิร์ฟเวอร์ใช้ สิ่งนี้ต้องการให้ไคลเอ็นต์ใช้ (หรือเปิดใช้งาน) ชุดการเข้ารหัสที่เซิร์ฟเวอร์รองรับ
  • ใช้ SSL เวอร์ชันที่เข้ากันไม่ได้ (เซิร์ฟเวอร์อาจยอมรับเฉพาะ TLS v1 ในขณะที่ไคลเอ็นต์สามารถใช้ได้เฉพาะ SSL v3 เท่านั้น) อีกครั้งไคลเอ็นต์อาจต้องตรวจสอบให้แน่ใจว่าใช้โปรโตคอล SSL / TLS เวอร์ชันที่เข้ากันได้
  • เส้นทางความเชื่อถือไม่สมบูรณ์สำหรับใบรับรองเซิร์ฟเวอร์ ไคลเอนต์อาจไม่เชื่อถือใบรับรองของเซิร์ฟเวอร์ ซึ่งมักจะส่งผลให้เกิดข้อผิดพลาดอย่างละเอียดมากขึ้น แต่ก็เป็นไปได้มากทีเดียว โดยปกติการแก้ไขคือการนำเข้าใบรับรอง CA ของเซิร์ฟเวอร์ไปยังที่เก็บความน่าเชื่อถือของไคลเอ็นต์
  • ใบรับรองจะออกให้สำหรับโดเมนอื่น อีกครั้งสิ่งนี้จะส่งผลให้มีข้อความที่ละเอียดมากขึ้น แต่ฉันจะระบุการแก้ไขที่นี่ในกรณีที่เป็นสาเหตุ ความละเอียดในกรณีนี้จะได้รับเซิร์ฟเวอร์ (ดูเหมือนจะไม่ใช่ของคุณ) เพื่อใช้ใบรับรองที่ถูกต้อง

เนื่องจากไม่สามารถระบุความล้มเหลวพื้นฐานได้จึงควรเปิดไฟล์ -Djavax.net.debug=allแฟล็กเพื่อเปิดใช้งานการดีบักของการเชื่อมต่อ SSL ที่สร้างขึ้น เมื่อเปิดการแก้ไขข้อบกพร่องคุณจะระบุได้ว่ากิจกรรมใดในการจับมือกันล้มเหลว

ปรับปรุง

จากรายละเอียดที่มีอยู่ในขณะนี้ดูเหมือนว่าปัญหาเกิดจากเส้นทางความน่าเชื่อถือของใบรับรองที่ไม่สมบูรณ์ระหว่างใบรับรองที่ออกให้กับเซิร์ฟเวอร์และ CA หลัก ในกรณีส่วนใหญ่นี่เป็นเพราะใบรับรองของ root CA ไม่มีอยู่ในที่เก็บความไว้วางใจซึ่งนำไปสู่สถานการณ์ที่ไม่สามารถมีเส้นทางความน่าเชื่อถือของใบรับรองได้ ใบรับรองนั้นไม่น่าเชื่อถือโดยลูกค้า เบราว์เซอร์สามารถแสดงคำเตือนเพื่อให้ผู้ใช้เพิกเฉยต่อสิ่งนี้ได้ แต่ก็ไม่เหมือนกับกรณีของไคลเอ็นต์ SSL (เช่นคลาสHttpsURLConnectionหรือไลบรารีไคลเอ็นต์ HTTP ใด ๆ เช่น Apache HttpComponents Client )

คลาสไคลเอ็นต์ / ไลบรารีเหล่านี้ส่วนใหญ่จะอาศัยที่เก็บความไว้วางใจที่ใช้โดย JVM สำหรับการตรวจสอบใบรับรอง ในกรณีส่วนใหญ่จะเป็นcacertsไฟล์ในไดเร็กทอรี JRE_HOME / lib / security หากมีการระบุตำแหน่งที่ตั้งของที่เก็บความไว้วางใจโดยใช้คุณสมบัติระบบ JVM javax.net.ssl.trustStoreที่เก็บในพา ธ นั้นมักจะเป็นที่เก็บที่ใช้โดยไลบรารีไคลเอ็นต์ หากคุณมีข้อสงสัยให้ดูที่Merchantชั้นเรียนของคุณและดูว่าชั้นเรียน / ไลบรารีนั้นใช้ในการเชื่อมต่อ

การเพิ่มใบรับรองของเซิร์ฟเวอร์ที่ออก CA ไปยังที่เก็บความน่าเชื่อถือนี้ควรจะช่วยแก้ปัญหาได้ คุณสามารถอ้างถึงคำตอบของฉันเกี่ยวกับคำถามที่เกี่ยวข้องเกี่ยวกับการรับเครื่องมือเพื่อจุดประสงค์นี้ แต่ยูทิลิตี้ Java keytoolนั้นเพียงพอสำหรับจุดประสงค์นี้

คำเตือน : Trust Store คือรายชื่อ CA ทั้งหมดที่คุณไว้วางใจ หากคุณใส่ใบรับรองที่ไม่ได้เป็นของ CA ที่คุณไม่เชื่อถือการเชื่อมต่อ SSL / TLS ไปยังไซต์ที่มีใบรับรองที่ออกโดยหน่วยงานนั้นสามารถถอดรหัสได้หากมีคีย์ส่วนตัว

อัปเดต # 2: การทำความเข้าใจผลลัพธ์ของการติดตาม JSSE

ที่เก็บคีย์และ Truststores ที่ใช้โดย JVM มักจะแสดงรายการที่จุดเริ่มต้นเหมือนดังต่อไปนี้:

keyStore is : 
keyStore type is : jks
keyStore provider is : 
init keystore
init keymanager of type SunX509
trustStore is: C:\Java\jdk1.6.0_21\jre\lib\security\cacerts
trustStore type is : jks
trustStore provider is : 

หากใช้ Truststore ไม่ถูกต้องคุณจะต้องนำเข้าใบรับรองของเซิร์ฟเวอร์ไปยังที่ถูกต้องอีกครั้งหรือกำหนดค่าเซิร์ฟเวอร์ใหม่เพื่อใช้ที่อยู่ในรายการ (ไม่แนะนำหากคุณมี JVM หลายตัวและทั้งหมดจะใช้สำหรับสิ่งที่แตกต่างกัน ความต้องการ)

หากคุณต้องการตรวจสอบว่ารายการใบรับรองความน่าเชื่อถือมีใบรับรองที่จำเป็นหรือไม่แสดงว่ามีส่วนที่เหมือนกันซึ่งเริ่มต้นด้วย:

adding as trusted cert:
  Subject: CN=blah, O=blah, C=blah
  Issuer:  CN=biggerblah, O=biggerblah, C=biggerblah
  Algorithm: RSA; Serial number: yadda
  Valid from SomeDate until SomeDate

คุณจะต้องค้นหาว่า CA ของเซิร์ฟเวอร์เป็นเรื่องหรือไม่

ขั้นตอนการจับมือจะมีรายการเด่น ๆ (คุณจำเป็นต้องรู้ SSL เพื่อทำความเข้าใจในรายละเอียด แต่เพื่อจุดประสงค์ในการดีบักปัญหาปัจจุบันก็เพียงพอแล้วที่จะรู้ว่าโดยทั่วไปแล้ว handshake_failure จะรายงานใน ServerHello

1. ลูกค้าสวัสดี

ชุดของรายการจะถูกรายงานเมื่อการเชื่อมต่อกำลังเริ่มต้น ข้อความแรกที่ไคลเอ็นต์ส่งในการตั้งค่าการเชื่อมต่อ SSL / TLS คือข้อความ ClientHello ซึ่งโดยปกติจะรายงานในบันทึกเป็น:

*** ClientHello, TLSv1
RandomCookie:  GMT: 1291302508 bytes = { some byte array }
Session ID:  {}
Cipher Suites: [SSL_RSA_WITH_RC4_128_MD5, SSL_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_DES_CBC_SHA, SSL_DHE_RSA_WITH_DES_CBC_SHA, SSL_DHE_DSS_WITH_DES_CBC_SHA, SSL_RSA_EXPORT_WITH_RC4_40_MD5, SSL_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA]
Compression Methods:  { 0 }
***

สังเกตชุดการเข้ารหัสที่ใช้ เรื่องนี้อาจต้องเห็นด้วยกับรายการในไฟล์ Merchant.properties ของคุณสำหรับการประชุมเดียวกันอาจใช้โดยไลบรารีของธนาคาร หากรูปแบบที่ใช้แตกต่างกันก็ไม่ต้องกังวลเพราะ ServerHello จะระบุหากชุดการเข้ารหัสเข้ากันไม่ได้

2. เซิร์ฟเวอร์สวัสดี

เซิร์ฟเวอร์ตอบสนองด้วย ServerHello ซึ่งจะระบุว่าการตั้งค่าการเชื่อมต่อสามารถดำเนินการต่อได้หรือไม่ รายการในบันทึกมักเป็นประเภทต่อไปนี้:

*** ServerHello, TLSv1
RandomCookie:  GMT: 1291302499 bytes = { some byte array}
Cipher Suite: SSL_RSA_WITH_RC4_128_SHA
Compression Method: 0
***

สังเกตชุดการเข้ารหัสที่เลือกไว้ นี่คือชุดที่ดีที่สุดสำหรับทั้งเซิร์ฟเวอร์และไคลเอนต์ โดยปกติจะไม่ระบุชุดการเข้ารหัสหากมีข้อผิดพลาด ใบรับรองของเซิร์ฟเวอร์ (และเป็นทางเลือกทั้งห่วงโซ่) ถูกส่งโดยเซิร์ฟเวอร์และจะพบในรายการดังนี้:

*** Certificate chain
chain [0] = [
[
  Version: V3
  Subject: CN=server, O=server's org, L=server's location, ST =Server's state, C=Server's country
  Signature Algorithm: SHA1withRSA, OID = some identifer

.... the rest of the certificate
***

หากการตรวจสอบใบรับรองสำเร็จคุณจะพบรายการที่คล้ายกับ:

Found trusted certificate:
[
[
  Version: V1
  Subject: OU=Server's CA, O="Server's CA's company name", C=CA's country
  Signature Algorithm: SHA1withRSA, OID = some identifier

หนึ่งในขั้นตอนข้างต้นจะไม่ประสบความสำเร็จส่งผลให้ handshake_failure โดยทั่วไปแล้วการจับมือจะเสร็จสมบูรณ์ในขั้นตอนนี้ (ไม่จริง แต่ขั้นตอนต่อมาของการจับมือมักจะไม่ทำให้การจับมือล้มเหลว) คุณจะต้องพิจารณาว่าขั้นตอนใดที่ล้มเหลวและโพสต์ข้อความที่เหมาะสมเพื่อเป็นการอัปเดตคำถาม (เว้นแต่คุณจะเข้าใจข้อความนั้นแล้วและคุณรู้ว่าต้องทำอย่างไรเพื่อแก้ไข)


โปรดโพสต์สิ่งที่คุณมีถ้าทำได้เพื่อที่เราจะได้อัปเดตคำตอบที่เจาะจงมากขึ้น
Vineet Reynolds

1
ตกลง Vineet ฉันคิดไม่ออกว่าจะจัดการอย่างไรฉันหมดแรงแล้ว ฉันพบวิธีตรวจสอบ URL เซิร์ฟเวอร์ด้วย openssl "openssl s_client -connect servername: 4402" และดูสิ่งที่ได้รับ: img225.imageshack.us/img225/8999/sc screenshoturr.png
Denees

@hoss ดูเหมือนว่าใบรับรองของเซิร์ฟเวอร์ออกโดยเอนทิตีที่ไม่มีอยู่ในที่เก็บความไว้วางใจที่ใช้โดย OpenSSL และอาจไม่มีอยู่ในที่เก็บความไว้วางใจที่เซิร์ฟเวอร์ของคุณใช้ (ไคลเอนต์) เมื่อเชื่อมต่อกับ เซิฟเวอร์. ในกรณีนี้คุณจะต้องนำเข้าใบรับรองของ CA ที่ออกใบรับรอง ( ไม่ใช่เซิร์ฟเวอร์ ) ไปยังที่เก็บความไว้วางใจของไคลเอนต์ (OpenSSL / เซิร์ฟเวอร์ของคุณ)
Vineet Reynolds

1
อาจเป็นเพราะอาศัย cacerts แต่คุณสามารถกำหนดได้ก็ต่อเมื่อคุณเข้าใจผลลัพธ์ของการดีบักเครือข่าย หากต้องการตรวจสอบสิ่งนี้คุณจะต้องใช้keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacertsคำสั่งเพื่อพิมพ์เนื้อหา จากนั้นตรวจสอบว่าใบรับรองใน cacerts ตรงกับ CA ของใบรับรองของธนาคารหรือไม่
Vineet Reynolds

5
changeitเริ่มต้นคือมักจะ เว้นแต่จะมีการเปลี่ยนแปลง
Vineet Reynolds


16

ความล้มเหลวในการจับมืออาจเป็นการใช้งานโปรโตคอล TLSv1 ที่มีข้อบกพร่อง

ในกรณีของเราสิ่งนี้ช่วยด้วย java 7:

java -Dhttps.protocols=TLSv1.2,TLSv1.1,TLSv1 

jvm จะเจรจาตามลำดับนี้ เซิร์ฟเวอร์ที่มีการอัปเดตล่าสุดจะทำ 1.2 ส่วนบั๊กจะลงไปที่ v1 และใช้งานได้กับ v1 ที่คล้ายกันใน java 7


1
สิ่งนี้ช่วยฉันได้ มี ClientHello ของฉัน แต่ไม่มีเซิร์ฟเวอร์จุดจบค่อนข้างฉับพลัน สิ่งนี้แก้ไขให้ฉันบน Java 7 ขอบคุณมาก
virgo47

15

นอกจากนี้ยังสามารถเกิดขึ้นเมื่อลูกค้าต้องการแสดงใบรับรอง หลังจากเซิร์ฟเวอร์แสดงรายการห่วงโซ่ใบรับรองสิ่งต่อไปนี้อาจเกิดขึ้น:

3. คำขอใบรับรอง เซิร์ฟเวอร์จะออกคำขอใบรับรองจากไคลเอนต์ คำขอจะแสดงรายการใบรับรองทั้งหมดที่เซิร์ฟเวอร์ยอมรับ

*** CertificateRequest
Cert Types: RSA
Cert Authorities:
<CN=blah, OU=blah, O=blah, L=blah, ST=blah, C=blah>
<CN=yadda, DC=yadda, DC=yadda>
<CN=moreblah, OU=moreblah, O=moreblah, C=moreblah>
<CN=moreyada, OU=moreyada, O=moreyada, C=moreyada>
... the rest of the request
*** ServerHelloDone

4. Client Certificate Chain นี่คือใบรับรองที่ไคลเอ็นต์ส่งไปยังเซิร์ฟเวอร์

*** Certificate chain
chain [0] = [
[
  Version: V3
  Subject: EMAILADDRESS=client's email, CN=client, OU=client's ou, O=client's Org, L=client's location, ST=client's state, C=client's Country
  Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5
  ... the rest of the certificate
*** ClientKeyExchange, RSA PreMasterSecret, TLSv1    
... key exchange info 

หากไม่มีใบรับรองในเครือข่ายและเซิร์ฟเวอร์ต้องการใบรับรองคุณจะได้รับข้อผิดพลาดในการจับมือที่นี่ สาเหตุที่เป็นไปได้คือไม่พบเส้นทางไปยังใบรับรองของคุณ

5. Certificate Verify ไคลเอนต์ขอให้เซิร์ฟเวอร์ตรวจสอบใบรับรอง

*** CertificateVerify
... payload of verify check

ขั้นตอนนี้จะเกิดขึ้นเมื่อคุณส่งใบรับรองเท่านั้น

6. เสร็จสิ้น เซิร์ฟเวอร์จะตอบกลับด้วยการตรวจสอบการตอบสนอง

*** Finished
verify_data:  { 345, ... }

ในกรณีของฉันดูเหมือนว่าทุกขั้นตอนจะเรียบร้อยดี แต่ยังคงได้รับข้อผิดพลาดในการจับมือ
tibi

คำตอบที่ดีมาก ... แต่ทั้งหมดนี้ก็โอเคในความล้มเหลวในการจับมือของฉัน แต่ฉันก็ยังล้มเหลว คุณช่วยดูคำถามที่คล้ายกันของฉันได้ไหม
tibi

การไม่แสดงใบรับรองไคลเอ็นต์ไม่ใช่ข้อผิดพลาดใด ๆ ใน TLS หากเซิร์ฟเวอร์ต้องการใบรับรองไคลเอ็นต์และไม่มีใบรับรองเซิร์ฟเวอร์จะปิดการเชื่อมต่อ
Marquis of Lorne

@EJP นั้นเป็นความจริงไม่ใช่ข้อผิดพลาดใน TLS แต่การเชื่อมต่อล้มเหลวจะปรากฏเป็นข้อผิดพลาดใน Java Code
Brig

1
@Brig แต่ไม่ใช่เป็นการแจ้งเตือนซึ่งคำตอบนี้บอกว่าอะไรและคำถามเกี่ยวกับอะไร
Marquis of Lorne

15

ฉันไม่คิดว่าสิ่งนี้จะช่วยแก้ปัญหาให้กับผู้ถามคนแรก แต่สำหรับ Googler ที่มาที่นี่เพื่อหาคำตอบ:


ในการอัปเดต 51 java 1.8 ห้าม [1] รหัส RC4 โดยค่าเริ่มต้นดังที่เราเห็นในหน้าบันทึกประจำรุ่น:

การแก้ไขข้อบกพร่อง: ห้ามชุดการเข้ารหัส RC4

ปัจจุบัน RC4 ถือเป็นรหัสที่ถูกบุกรุก

ชุดการเข้ารหัส RC4 ถูกลบออกจากรายการชุดการเข้ารหัสที่เปิดใช้งานไคลเอ็นต์และเซิร์ฟเวอร์เริ่มต้นในการใช้งาน Oracle JSSE ชุดการเข้ารหัสเหล่านี้ยังสามารถเปิดใช้งานSSLEngine.setEnabledCipherSuites()และSSLSocket.setEnabledCipherSuites()วิธีการได้ ดู JDK-8077109 (ไม่ใช่สาธารณะ)

หากเซิร์ฟเวอร์ของคุณมีค่ากำหนดที่ชัดเจนสำหรับการเข้ารหัสนี้ (หรือใช้เฉพาะการเข้ารหัสนี้) สิ่งนี้สามารถทริกเกอร์handshake_failureบน java

คุณสามารถทดสอบการเชื่อมต่อกับเซิร์ฟเวอร์ที่เปิดใช้รหัส RC4 (ก่อนอื่นให้ลองโดยไม่ต้อง enabledอาร์กิวเมนต์เพื่อดูว่าทริกเกอร์ a handshake_failureจากนั้นตั้งค่าenabled:

import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import java.io.*;

import java.util.Arrays;

/** Establish a SSL connection to a host and port, writes a byte and
 * prints the response. See
 * http://confluence.atlassian.com/display/JIRA/Connecting+to+SSL+services
 */
public class SSLRC4Poke {
    public static void main(String[] args) {
        String[] cyphers;
        if (args.length < 2) {
            System.out.println("Usage: "+SSLRC4Poke.class.getName()+" <host> <port> enable");
            System.exit(1);
        }
        try {
            SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
            SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(args[0], Integer.parseInt(args[1]));
        
            cyphers = sslsocketfactory.getSupportedCipherSuites();
            if (args.length ==3){
                sslsocket.setEnabledCipherSuites(new String[]{
                    "SSL_DH_anon_EXPORT_WITH_RC4_40_MD5",
                    "SSL_DH_anon_WITH_RC4_128_MD5",
                    "SSL_RSA_EXPORT_WITH_RC4_40_MD5",
                    "SSL_RSA_WITH_RC4_128_MD5",
                    "SSL_RSA_WITH_RC4_128_SHA",
                    "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",
                    "TLS_ECDHE_RSA_WITH_RC4_128_SHA",
                    "TLS_ECDH_ECDSA_WITH_RC4_128_SHA",
                    "TLS_ECDH_RSA_WITH_RC4_128_SHA",
                    "TLS_ECDH_anon_WITH_RC4_128_SHA",
                    "TLS_KRB5_EXPORT_WITH_RC4_40_MD5",
                    "TLS_KRB5_EXPORT_WITH_RC4_40_SHA",
                    "TLS_KRB5_WITH_RC4_128_MD5",
                    "TLS_KRB5_WITH_RC4_128_SHA"
                });     
            }

            InputStream in = sslsocket.getInputStream();
            OutputStream out = sslsocket.getOutputStream();

            // Write a test byte to get a reaction :)
            out.write(1);

            while (in.available() > 0) {
                System.out.print(in.read());
            }
            System.out.println("Successfully connected");

        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
}

1 - https://www.java.com/en/download/faq/release_changes.xml


10

ฉันมีข้อผิดพลาดนี้ขณะพยายามใช้ JDK 1.7 เมื่อฉันอัปเกรด JDK เป็น jdk1.8.0_66 ทั้งหมดเริ่มทำงานได้ดี

ดังนั้นวิธีแก้ปัญหาที่ง่ายที่สุดสำหรับปัญหานี้คือ - อัพเกรด JDK ของคุณและมันจะเริ่มทำงานได้ดี


4
ดี ทางออกที่ง่ายที่สุดคือการอัพเกรด JDK? : D คุณรู้ไหมว่ามันซับซ้อนแค่ไหนขึ้นอยู่กับสภาพแวดล้อมที่กำลังทำอยู่? สมมติว่า Amazon ใช้ JDK 7 และตอนนี้จะต้องอัปเกรดเป็น JDK 8 ทันที ... ดี!
Arturas M

1
การอัปเกรดเวอร์ชันรองอย่างง่ายช่วยแก้ปัญหานี้ให้ฉันได้ .. จาก JDK 11.0.1 เป็น 11.0.6
Clint

5

ในกรณีของฉันใบรับรองถูกนำเข้าข้อผิดพลาดยังคงอยู่แก้ไขได้โดยการเพิ่มSystem.setProperty("https.protocols", "TLSv1.2,TLSv1.1,SSLv3");ก่อนเชื่อมต่อ


ทำงานให้ฉันใน java 1.8 ขอบคุณ :)
Supun Amarasinghe

3

สมมติว่าคุณใช้โปรโตคอล SSL / TLS ที่เหมาะสมกำหนดค่าอย่างถูกต้องkeyStoreและtrustStoreและยืนยันว่าไม่มีปัญหาใด ๆ กับใบรับรองคุณอาจต้องเสริมสร้างอัลกอริทึมความปลอดภัยของคุณเสริมสร้างอัลกอริทึมการรักษาความปลอดภัยของคุณ

ดังที่กล่าวไว้ในคำตอบของ Vineetสาเหตุหนึ่งที่เป็นไปได้ที่คุณได้รับข้อผิดพลาดนี้เกิดจากการใช้ชุดการเข้ารหัสที่เข้ากันไม่ได้ ด้วยการอัปเดต my local_policyand US_export_policyjars ในsecurityโฟลเดอร์JDK ของฉันด้วยไฟล์ที่มีให้ในJava Cryptography Extension (JCE)ฉันจึงสามารถจับมือได้สำเร็จ


2

วันนี้ฉันพบปัญหาเดียวกันกับไคลเอนต์ OkHttp เพื่อรับ URL ตาม https มันเป็นเกิดจาก Https โปรโตคอลรุ่นและวิธีการเข้ารหัสไม่ตรงกันระหว่างฝั่งเซิร์ฟเวอร์และฝั่งไคลเอ็นต์โปรโตคอลรุ่นและวิธีการเข้ารหัสไม่ตรงกันระหว่างฝั่งเซิร์ฟเวอร์และฝั่งไคลเอ็นต์

1) ตรวจสอบเวอร์ชันโปรโตคอล https ของเว็บไซต์และวิธีการเข้ารหัส

openssl>s_client -connect your_website.com:443 -showcerts

คุณจะได้รับข้อมูลรายละเอียดมากมายข้อมูลที่สำคัญจะแสดงดังนี้:

SSL-Session:
    Protocol  : TLSv1
    Cipher    : RC4-SHA
2) กำหนดค่าไคลเอ็นต์ http ของคุณตัวอย่างเช่นในกรณีไคลเอนต์ OkHttp :
@Test()
public void testHttpsByOkHttp() {
    ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
            .tlsVersions(TlsVersion.TLS_1_0) //protocol version
            .cipherSuites(
                    CipherSuite.TLS_RSA_WITH_RC4_128_SHA, //cipher method
                    CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
                    CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
                    CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256)
            .build();

    OkHttpClient client = new OkHttpClient();
    client.setConnectionSpecs(Collections.singletonList(spec));
    Request request = new Request.Builder().url("https://your_website.com/").build();
    try {
        Response response = client.newCall(request).execute();
        if(response.isSuccessful()){
            logger.debug("result= {}", response.body().string());
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

สิ่งนี้จะได้สิ่งที่เราต้องการ


2

ฉันพบเซิร์ฟเวอร์ HTTPS ซึ่งล้มเหลวในลักษณะนี้หากกระบวนการไคลเอ็นต์ Java ของฉันถูกกำหนดค่าด้วย

-Djsse.enableSNIExtension=false

การเชื่อมต่อล้มเหลวด้วยhandshake_failureหลังจากServerHelloเสร็จสิ้นเรียบร้อยแล้ว แต่ก่อนที่สตรีมข้อมูลจะเริ่มต้น

ไม่มีข้อความแสดงข้อผิดพลาดที่ชัดเจนซึ่งระบุปัญหาข้อผิดพลาดดูเหมือนว่า

main, READ: TLSv1.2 Alert, length = 2
main, RECV TLSv1.2 ALERT:  fatal, handshake_failure
%% Invalidated:  [Session-3, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384]
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

ฉันแยกปัญหาโดยลองใช้และไม่มี-Djsse.enableSNIExtension=falseตัวเลือก ""


ฉันได้รับข้อผิดพลาดเดียวกันขณะเชื่อมต่อกับแซนด์บ็อกซ์ GDAX วิธีแก้ปัญหานี้หรือไม่
Nitin Vavdiya

1

ของฉันคือ TLSข้อผิดพลาดที่เข้ากันไม่เวอร์ชัน

ก่อนหน้านี้TLSv1ฉันเปลี่ยนมันTLSV1.2ช่วยแก้ปัญหาของฉันได้


1

ฉันใช้ไคลเอ็นต์ com.google.api http เมื่อฉันสื่อสารกับไซต์ของ บริษัท ภายในฉันพบปัญหานี้เมื่อฉันใช้ https โดยไม่ถูกต้องแทนที่จะเป็น http

main, READ: TLSv1.2 Alert, length = 2
main, RECV TLSv1.2 ALERT:  fatal, handshake_failure
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
main, IOException in getSession():  javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
main, called close()
main, called closeInternal(true)
262 [main] DEBUG org.apache.http.impl.conn.DefaultClientConnection  - Connection shut down
main, called close()
main, called closeInternal(true)
263 [main] DEBUG org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager  - Released connection is not reusable.
263 [main] DEBUG org.apache.http.impl.conn.tsccm.ConnPoolByRoute  - Releasing connection [HttpRoute[{s}->https://<I-replaced>]][null]
263 [main] DEBUG org.apache.http.impl.conn.tsccm.ConnPoolByRoute  - Notifying no-one, there are no waiting threads
Exception in thread "main" javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
    at sun.security.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:431)
    at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128)
    at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:339)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:123)
    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:147)
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:108)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:641)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:576)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:554)
    at com.google.api.client.http.apache.ApacheHttpRequest.execute(ApacheHttpRequest.java:67)
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:960)

ไม่คุณทำไม่ได้ เซิร์ฟเวอร์ไม่สามารถส่งการแจ้งเตือน TLS ได้หากไม่ได้พูด TLS
Marquis of Lorne

ฉันได้อัปเดตความคิดเห็นของฉันเพื่อแสดงผลลัพธ์จากโปรแกรมของฉัน นี่คือเรื่องจริง จะขอบคุณมากถ้าคุณลบการโหวตลง
thebiggestlebowski

เป็นเรื่องจริง แต่ไม่ได้เกิดจากการพูดคุย TLS กับเซิร์ฟเวอร์ข้อความธรรมดา เซิร์ฟเวอร์ข้อความธรรมดาไม่ได้พูดถึง TLS ตามคำจำกัดความดังนั้นคุณจึงไม่สามารถรับการแจ้งเตือน TLS จากเซิร์ฟเวอร์ได้ตามคำจำกัดความ คุณไม่มีข้อมูลว่าใครลดคะแนนคำตอบของคุณ
Marquis of Lorne

ฉันถือว่าคุณโหวตไม่ลง - ขอโทษของฉันหากไม่เป็นเช่นนั้น ข้อความแสดงข้อผิดพลาดของฉันตรงกับชื่อคำถามนี้ทุกประการ เป็นเส้นทาง / กรณีทดสอบที่ถูกต้องเพื่อรับข้อความแสดงข้อผิดพลาดนี้และฉันมีวิธีแก้ไขที่อาจช่วยคนอื่นได้ ด้วยความเคารพฉันไม่คิดว่ามันจะสำคัญหากเกิดจากการตอบสนองข้อผิดพลาดของเซิร์ฟเวอร์ TLS หรือไม่ มีคนมาที่นี่จาก google และคำตอบของฉันอาจช่วยได้หากพวกเขาทำผิดพลาดเดียวกัน
thebiggestlebowski

ฉันไม่ได้พูดอะไรเกี่ยวกับข้อความแสดงข้อผิดพลาดของคุณ ฉันแสดงความคิดเห็นเกี่ยวกับการอ้างสิทธิ์ที่ไม่ถูกต้องของคุณว่าเกิดจาก 'ใช้ HTTPS แทน HTTP โดยไม่ได้ตั้งใจ' ไม่ใช่และเป็นไปไม่ได้ด้วยเหตุผลที่ฉันได้ระบุไว้และสิ่งที่คุณไม่ได้กล่าวถึงในทางใดทางหนึ่ง การใช้ HTTP จะทำให้หายไปอย่างแน่นอนเนื่องจากไม่มีการแจ้งเตือน TLS ในรูปแบบข้อความธรรมดา แต่ไม่ได้แก้ไขปัญหาพื้นฐาน
Marquis of Lorne


1

Ugg! สิ่งนี้กลายเป็นปัญหาเวอร์ชัน Java สำหรับฉัน ฉันพบข้อผิดพลาดในการจับมือโดยใช้ JRE 1.6 และทุกอย่างทำงานได้อย่างสมบูรณ์โดยใช้ JRE 1.8.0_144


0

ข้อจำกัดความรับผิดชอบ: ฉันไม่ทราบว่าคำตอบจะเป็นประโยชน์สำหรับหลาย ๆ คนหรือไม่เพียงแค่แบ่งปันเพราะอาจจะ

ฉันได้รับข้อผิดพลาดนี้ขณะใช้ Parasoft SOATest เพื่อส่งคำขอ XML (SOAP)

ปัญหาคือฉันเลือกนามแฝงที่ไม่ถูกต้องจากเมนูแบบเลื่อนลงหลังจากเพิ่มใบรับรองและตรวจสอบสิทธิ์แล้ว


0

ในกรณีของฉันเว็บไซต์สามารถใช้ TLSv1.2 ได้ และฉันใช้ apache httpclient 4.5.6 ฉันใช้รหัสนี้และติดตั้ง jce เพื่อแก้ปัญหานี้ (JDK1.7):

JCE

jdk7 http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html

jdk 8 http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

รหัส:

SSLContext sslContext = SSLContext.getDefault();

  SSLConnectionSocketFactory sslConnectionFactory = new SSLConnectionSocketFactory(
      sslContext,
      new String[]{"TLSv1.2"}, // important
      null,
      NoopHostnameVerifier.INSTANCE);

  Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
      .register("https", sslConnectionFactory)
      .register("http", PlainConnectionSocketFactory.INSTANCE)
      .build();

  HttpClientConnectionManager ccm = new BasicHttpClientConnectionManager(registry);
  httpclient = HttpClientBuilder.create().
      .setSSLSocketFactory(sslConnectionFactory)
      .setConnectionManager(ccm)
      .build();

0

ในการแก้ไขปัญหาจากมุมมองของผู้พัฒนา (ข้อ 1) และผู้ดูแลระบบ (รายการ 2 และ 3):

  1. เปิดใช้งาน SSL handshake debug ที่ Java ผ่าน -Djavax.net.debug=ssl:handshake:verboseผ่าน
  2. ติดตั้ง ssldump ที่เซิร์ฟเวอร์ผ่านsudo apt install ssldumpหรือคอมไพล์จากซอร์สตามลิงค์นี้หากคุณสังเกตUnknown valueในการเข้ารหัสเมื่อคุณเรียกใช้ขั้นตอนด้านล่าง
  3. ที่เซิร์ฟเวอร์ sudo ssldump -k <your-private-key> -i <your-network-interface>
  4. ตรวจสอบบันทึกเกี่ยวกับเหตุผลที่แท้จริงของความล้มเหลว

ตัวอย่างการจับมือไม่ทำงานของบันทึก ssldump:

New TCP connection #1: 10.1.68.86(45308) <-> 10.1.68.83(5671)
1 1  0.0111 (0.0111)  C>S  Handshake
      ClientHello
        Version 3.3
        cipher suites
        TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
        TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
        TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
        TLS_RSA_WITH_AES_256_GCM_SHA384
        TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
        TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
        TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
        TLS_DHE_DSS_WITH_AES_256_GCM_SHA384
        TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
        TLS_RSA_WITH_AES_128_GCM_SHA256
        TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
        TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
        TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
        TLS_DHE_DSS_WITH_AES_128_GCM_SHA256
        TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
        TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
        TLS_RSA_WITH_AES_256_CBC_SHA256
        TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
        TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
        TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
        TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
        TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
        TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
        TLS_RSA_WITH_AES_256_CBC_SHA
        TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
        TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
        TLS_DHE_RSA_WITH_AES_256_CBC_SHA
        TLS_DHE_DSS_WITH_AES_256_CBC_SHA
        TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
        TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
        TLS_RSA_WITH_AES_128_CBC_SHA256
        TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
        TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
        TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
        TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
        TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
        TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
        TLS_RSA_WITH_AES_128_CBC_SHA
        TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
        TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
        TLS_DHE_RSA_WITH_AES_128_CBC_SHA
        TLS_DHE_DSS_WITH_AES_128_CBC_SHA
        TLS_EMPTY_RENEGOTIATION_INFO_SCSV
        compression methods
                  NULL
1 2  0.0122 (0.0011)  S>C  Alert
    level           fatal
    value           insufficient_security
1    0.0126 (0.0004)  S>C  TCP RST

ตัวอย่างการจับมือที่ประสบความสำเร็จของบันทึก ssldump

New TCP connection #1: 10.1.68.86(56558) <-> 10.1.68.83(8443)
1 1  0.0009 (0.0009)  C>S  Handshake
      ClientHello
        Version 3.3
        cipher suites
        TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
        TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
        TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
        Unknown value 0xcca9
        Unknown value 0xcca8
        Unknown value 0xccaa
        TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
        TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
        TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
        TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
        TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
        TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
        TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
        TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
        TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
        TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
        TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
        TLS_DHE_RSA_WITH_AES_256_CBC_SHA
        TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
        TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
        TLS_DHE_RSA_WITH_AES_128_CBC_SHA
        TLS_RSA_WITH_AES_256_GCM_SHA384
        TLS_RSA_WITH_AES_128_GCM_SHA256
        TLS_RSA_WITH_AES_256_CBC_SHA256
        TLS_RSA_WITH_AES_128_CBC_SHA256
        TLS_RSA_WITH_AES_256_CBC_SHA
        TLS_RSA_WITH_AES_128_CBC_SHA
        TLS_EMPTY_RENEGOTIATION_INFO_SCSV
        compression methods
                  NULL
1 2  0.0115 (0.0106)  S>C  Handshake
      ServerHello
        Version 3.3
        session_id[0]=

        cipherSuite         TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
        compressionMethod                   NULL
1 3  0.0115 (0.0000)  S>C  Handshake
      Certificate
1 4  0.0115 (0.0000)  S>C  Handshake
      ServerKeyExchange
Not enough data. Found 294 bytes (expecting 32767)
1 5    0.0115   (0.0000)    S>C    Handshake
        ServerHelloDone
1 6    0.0141   (0.0025)    C>S    Handshake
        ClientKeyExchange
Not enough data. Found 31 bytes (expecting 16384)
1 7    0.0141   (0.0000)    C>S    ChangeCipherSpec
1 8    0.0141   (0.0000)    C>S      Handshake
1 9    0.0149   (0.0008)    S>C    Handshake
1 10   0.0149   (0.0000)    S>C    ChangeCipherSpec
1 11   0.0149   (0.0000)    S>C      Handshake

ตัวอย่างบันทึก Java ที่ไม่ทำงาน

javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.778 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.779 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.779 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.780 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_256_GCM_SHA384 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.780 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.780 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.781 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.781 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.781 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.782 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_128_GCM_SHA256 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.782 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.782 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.782 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.783 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.783 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.783 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.783 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA256 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.783 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.784 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.784 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: T LS_DHE_RSA_WITH_AES_256_CBC_SHA256 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.784 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 for TLS11
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.784 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.784 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.784 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.784 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_256_GCM_SHA384 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.785 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.785 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.785 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.785 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.785 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.785 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_128_GCM_SHA256 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.785 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.785 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.786 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.786 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.786 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.786 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.786 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA256 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.786 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 for TLS10 javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.786 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.786 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 for TLS10
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.787 MYT|HandshakeContext.java:294|Ignore unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 for TLS10
javax.net.ssl|WARNING|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.818 MYT|SignatureScheme.java:282|Signature algorithm, ed25519, is not supported by the underlying providers
javax.net.ssl|WARNING|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.818 MYT|SignatureScheme.java:282|Signature algorithm, ed448, is not supported by the underlying providers
javax.net.ssl|ALL|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.822 MYT|SignatureScheme.java:358|Ignore disabled signature sheme: rsa_md5
javax.net.ssl|INFO|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.822 MYT|AlpnExtension.java:161|No available application protocols
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.823 MYT|SSLExtensions.java:256|Ignore, context unavailable extension: application_layer_protocol_negotiation
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.823 MYT|SSLExtensions.java:256|Ignore, context unavailable extension: renegotiation_info
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.825 MYT|ClientHello.java:651|Produced ClientHello handshake message (
"ClientHello": {
  "client version"      : "TLSv1.2",
  "random"              : "FB BC CD 7C 17 65 86 49 3E 1C 15 37 24 94 7D E7 60 44 1B B8 F4 18 21 D0 E1 B1 31 0D E1 80 D6 A7",
  "session id"          : "",
  "cipher suites"       : "[TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384(0xC02C), TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256(0xC02B), TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384(0xC030), TLS_RSA_WITH_AES_256_GCM_SHA384(0x009D), TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384(0xC02E), TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384(0xC032), TLS_DHE_RSA_WITH_AES_256_GCM_SHA384(0x009F), TLS_DHE_DSS_WITH_AES_256_GCM_SHA384(0x00A3), TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256(0xC02F), TLS_RSA_WITH_AES_128_GCM_SHA256(0x009C), TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256(0xC02D), TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256(0xC031), TLS_DHE_RSA_WITH_AES_128_GCM_SHA256(0x009E), TLS_DHE_DSS_WITH_AES_128_GCM_SHA256(0x00A2), TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384(0xC024), TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384(0xC028), TLS_RSA_WITH_AES_256_CBC_SHA256(0x003D), TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384(0xC026), TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384(0xC02A), TLS_DHE_RSA_WITH_AES_256_CBC_SHA256(0x006B), TLS_DHE_DSS_WITH_AES_256_CBC_SHA256(0x006A), TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA(0xC00A), TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA(0xC014), TLS_RSA_WITH_AES_256_CBC_SHA(0x0035), TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA(0xC005), TLS_ECDH_RSA_WITH_AES_256_CBC_SHA(0xC00F), TLS_DHE_RSA_WITH_AES_256_CBC_SHA(0x0039), TLS_DHE_DSS_WITH_AES_256_CBC_SHA(0x0038), TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256(0xC023), TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256(0xC027), TLS_RSA_WITH_AES_128_CBC_SHA256(0x003C), TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256(0xC025), TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256(0xC029), TLS_DHE_RSA_WITH_AES_128_CBC_SHA256(0x0067), TLS_DHE_DSS_WITH_AES_128_CBC_SHA256(0x0040), TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA(0xC009), TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA(0xC013), TLS_RSA_WITH_AES_128_CBC_SHA(0x002F), TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA(0xC004), TLS_ECDH_RSA_WITH_AES_128_CBC_SHA(0xC00E), TLS_DHE_RSA_WITH_AES_128_CBC_SHA(0x0033), TLS_DHE_DSS_WITH_AES_128_CBC_SHA(0x0032), TLS_EMPTY_RENEGOTIATION_INFO_SCSV(0x00FF)]",
  "compression methods" : "00",  "extensions"          : [
    "server_name (0)": {
      type=host_name (0), value=mq.tpc-ohcis.moh.gov.my
    },
    "status_request (5)": {
      "certificate status type": ocsp
      "OCSP status request": {
        "responder_id": <empty>
        "request extensions": {
          <empty>
        }
      }
    },
    "supported_groups (10)": {
      "versions": [secp256r1, secp384r1, secp521r1, sect283k1, sect283r1, sect409k1, sect409r1, sect571k1, sect571r1, secp256k1, ffdhe2048, ffdhe3072, ffdhe4096, ffdhe6144, ffdhe8192]
    },
    "ec_point_formats (11)": {
      "formats": [uncompressed]
    },
    "signature_algorithms (13)": {
      "signature schemes": [ecdsa_secp256r1_sha256, ecdsa_secp384r1_sha384, ecdsa_secp512r1_sha512, rsa_pss_rsae_sha256, rsa_pss_rsae_sha384, rsa_pss_rsae_sha512, rsa_pss_pss_sha256, rsa_pss_pss_sha384, rsa_pss_pss_sha512, rsa_pkcs1_sha256, rsa_pkcs1_sha384, rsa_pkcs1_sha512, dsa_sha256, ecdsa_sha224, rsa_sha224, dsa_sha224, ecdsa_sha1, rsa_pkcs1_sha1, dsa_sha1]
    },
    "signature_algorithms_cert (50)": {
      "signature schemes": [ecdsa_secp256r1_sha256, ecdsa_secp384r1_sha384, ecdsa_secp512r1_sha512, rsa_pss_rsae_sha256, rsa_pss_rsae_sha384, rsa_pss_rsae_sha512, rsa_pss_pss_sha256, rsa_pss_pss_sha384, rsa_pss_pss_sha512, rsa_pkcs1_sha256, rsa_pkcs1_sha384, rsa_pkcs1_sha512, dsa_sha256, ecdsa_sha224, rsa_sha224, dsa_sha224, ecdsa_sha1, rsa_pkcs1_sha1, dsa_sha1]
    },
    "status_request_v2 (17)": {
      "cert status request": {
        "certificate status type": ocsp_multi
        "OCSP status request": {
          "responder_id": <empty>
          "request extensions": {
            <empty>
          }
        }      }
    },
    "extended_master_secret (23)": {
      <empty>
    },
    "supported_versions (43)": {
      "versions": [TLSv1.2, TLSv1.1, TLSv1]
    }
  ]
}
)
javax.net.ssl|DEBUG|43|SimpleAsyncTaskExecutor-1|2019-07-03 17:35:01.829 MYT|Alert.java:238|Received alert message (
"Alert": {
  "level"      : "fatal",
  "description": "insufficient_security"
}
)

0

ในกรณีของฉันฉันมีปัญหากับเวอร์ชัน 1.1 ฉันทำซ้ำปัญหาได้อย่างง่ายดายด้วย curl เซิร์ฟเวอร์ไม่รองรับเวอร์ชันที่ต่ำกว่า TLS1.2

สิ่งนี้ได้รับปัญหาการจับมือกัน:

curl --insecure --tlsv1.1 -i https://youhost --noproxy "*"

ด้วยเวอร์ชัน 1.2 มันใช้งานได้ดี:

curl --insecure --tlsv1.2 -i https://youhost --noproxy "*"

เซิร์ฟเวอร์กำลังเรียกใช้ Weblogic และการเพิ่มอาร์กิวเมนต์นี้ใน setEnvDomain.sh ทำให้ทำงานกับ TLSv1.1:

-Dweblogic.security.SSL.minimumProtocolVersion=TLSv1.1

0

ปัญหานี้เกิดขึ้นเนื่องจากเวอร์ชันจาวา ฉันใช้ 1.8.0.231 JDK และได้รับข้อผิดพลาดนี้ ฉันลดระดับเวอร์ชัน java จาก 1.8.0.231 เป็น 1.8.0.171 ตอนนี้ใช้งานได้ดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.