4.2 Data-transport libraries
In practice, most applications rely on data-transport frameworks
to establish HTTPS connections. These frameworks use SSL libraries internally in a way that is usually opaque to applications.
Apache HttpClient. Apache HttpClient3
is a client-side HTTP(S)
Java library based on JDK. The latest version is 4.2.1, published
on June 29, 2012, but most existing software employs older, 3.*
versions. Apache HttpClient is used extensively in Web-services
middleware such as Apache Axis 2 (see Section 8) because native
JDK does not support SOAP Web services. Furthermore, Apache
HttpClient provides better performance than JDK for functionalities such as sending HTTP POST requests.
Apache HttpClient uses JSSE’s SSLSocketFactory to establish
SSL connections. As explained in Section 4.1, this means that
Apache HttpClient must perform its own hostname verification.
This leads to numerous vulnerabilities in software based on older
versions on HttpClient that do not verify hostnames (Section 7.5).
Furthermore, Apache HttpClient uses HttpHost data structure to
describe HTTP(S) connections. HttpHost does not have any internal consistency checks: for example, it allows connections to port
443 to have HTTP as the scheme. In Section 7.8, we show how this
leads to errors even in code implemented by SSL experts.
Weberknecht. Weberknecht4
is a Java implementation of the WebSockets protocol. It uses SSLSocketFactory but does not perform
its own hostname verification. Any Java program that employs Weberknecht is vulnerable to a man-in-the-middle attack.
cURL. cURL5
is a popular tool and library (libcurl) for fetching
data from remote servers. Since version 7.10, cURL validates SSL
certificates by default. Internally, it uses OpenSSL to verify the
chain of trust and verifies the hostname itself. This functionality is
controlled by parameters CURLOPT_SSL_VERIFYPEER (default value:
true) and CURLOPT_SSL_VERIFYHOST (default value: 2).
This interface is almost perversely bad. The VERIFYPEER parameter is a boolean, while a similar-looking VERIFYHOST parameter is
an integer. The following quote from the cURL manual explains
the meaning of CURLOPT_SSL_VERIFYHOST:
1 to check the existence of a common name in the SSL
peer certificate. 2 to check the existence of a common
name and also verify that it matches the hostname provided. In production environments the value of this
option should be kept at 2 (default value).
Well-intentioned developers not only routinely misunderstand
these parameters, but often set CURLOPT_SSL_VERIFY HOST to TRUE,
thereby changing it to 1 and thus accidentally disabling hostname
verification with disastrous consequences (see Section 7.1).
PHP. PHP provides several methods for establishing SSL connections. For example, fsockopen, which opens a raw socket to the
remote server, can be used to connect to SSL servers by putting
“ssl://” in the URL. Even though fsockopen does not perform any
certificate checks whatsoever, PHP application developers routinely
use it for SSL connection establishment (see Section 9).
PHP also provides a cURL binding, which uses cURL’s default
settings to establish SSL connections with proper certificate validation. As we show in Sections 7.1, 7.2, and 7.3, application developers often set cURL options incorrectly, overriding the defaults and
breaking certificate validation.
Python. Several Python modules can be used for SSL connection
establishment. urllib, urllib2, and httplib connect to SSL servers
but do not check certificates. This is clearly documented in a bright
pink box on the urllib front page:6
Warning: When opening HTTPS URLs, it does not
attempt to validate the server certificate. Use at your
own risk!
Nevertheless, even high-security applications routinely use these
modules for SSL connection establishment (see Section 9).
Python also has an ssl module. This module verifies the certificate’s chain of trust, but not the hostname. The application must do
its own hostname verification. In Python version 3, the ssl module
introduced the match_hostname method for hostname verification,
but it must be explicitly called by the application.
4.2 Data-transport libraries
In practice, most applications rely on data-transport frameworks
to establish HTTPS connections. These frameworks use SSL libraries internally in a way that is usually opaque to applications.
Apache HttpClient. Apache HttpClient3
is a client-side HTTP(S)
Java library based on JDK. The latest version is 4.2.1, published
on June 29, 2012, but most existing software employs older, 3.*
versions. Apache HttpClient is used extensively in Web-services
middleware such as Apache Axis 2 (see Section 8) because native
JDK does not support SOAP Web services. Furthermore, Apache
HttpClient provides better performance than JDK for functionalities such as sending HTTP POST requests.
Apache HttpClient uses JSSE’s SSLSocketFactory to establish
SSL connections. As explained in Section 4.1, this means that
Apache HttpClient must perform its own hostname verification.
This leads to numerous vulnerabilities in software based on older
versions on HttpClient that do not verify hostnames (Section 7.5).
Furthermore, Apache HttpClient uses HttpHost data structure to
describe HTTP(S) connections. HttpHost does not have any internal consistency checks: for example, it allows connections to port
443 to have HTTP as the scheme. In Section 7.8, we show how this
leads to errors even in code implemented by SSL experts.
Weberknecht. Weberknecht4
is a Java implementation of the WebSockets protocol. It uses SSLSocketFactory but does not perform
its own hostname verification. Any Java program that employs Weberknecht is vulnerable to a man-in-the-middle attack.
cURL. cURL5
is a popular tool and library (libcurl) for fetching
data from remote servers. Since version 7.10, cURL validates SSL
certificates by default. Internally, it uses OpenSSL to verify the
chain of trust and verifies the hostname itself. This functionality is
controlled by parameters CURLOPT_SSL_VERIFYPEER (default value:
true) and CURLOPT_SSL_VERIFYHOST (default value: 2).
This interface is almost perversely bad. The VERIFYPEER parameter is a boolean, while a similar-looking VERIFYHOST parameter is
an integer. The following quote from the cURL manual explains
the meaning of CURLOPT_SSL_VERIFYHOST:
1 to check the existence of a common name in the SSL
peer certificate. 2 to check the existence of a common
name and also verify that it matches the hostname provided. In production environments the value of this
option should be kept at 2 (default value).
Well-intentioned developers not only routinely misunderstand
these parameters, but often set CURLOPT_SSL_VERIFY HOST to TRUE,
thereby changing it to 1 and thus accidentally disabling hostname
verification with disastrous consequences (see Section 7.1).
PHP. PHP provides several methods for establishing SSL connections. For example, fsockopen, which opens a raw socket to the
remote server, can be used to connect to SSL servers by putting
“ssl://” in the URL. Even though fsockopen does not perform any
certificate checks whatsoever, PHP application developers routinely
use it for SSL connection establishment (see Section 9).
PHP also provides a cURL binding, which uses cURL’s default
settings to establish SSL connections with proper certificate validation. As we show in Sections 7.1, 7.2, and 7.3, application developers often set cURL options incorrectly, overriding the defaults and
breaking certificate validation.
Python. Several Python modules can be used for SSL connection
establishment. urllib, urllib2, and httplib connect to SSL servers
but do not check certificates. This is clearly documented in a bright
pink box on the urllib front page:6
Warning: When opening HTTPS URLs, it does not
attempt to validate the server certificate. Use at your
own risk!
Nevertheless, even high-security applications routinely use these
modules for SSL connection establishment (see Section 9).
Python also has an ssl module. This module verifies the certificate’s chain of trust, but not the hostname. The application must do
its own hostname verification. In Python version 3, the ssl module
introduced the match_hostname method for hostname verification,
but it must be explicitly called by the application.
การแปล กรุณารอสักครู่..
4.2 การขนส่งข้อมูลห้องสมุด
ในทางปฏิบัติโปรแกรมประยุกต์ส่วนใหญ่พึ่งพาการขนส่งข้อมูลกรอบ
สร้าง HTTPS การเชื่อมต่อ กรอบเหล่านี้ใช้ภายในห้องสมุด SSL ในทางที่มักจะทึบเพื่อการใช้งาน .
Apache httpclient . Apache httpclient3
เป็นลูกค้า HTTP ( s )
ห้องสมุด Java ตามเพลง . รุ่นล่าสุด 4.2.1 ตีพิมพ์
เมื่อมิถุนายน 29 , 2012แต่ส่วนใหญ่ที่มีอยู่ซอฟต์แวร์พนักงานเก่า 3 . *
รุ่น Apache httpclient ถูกใช้อย่างกว้างขวางในการให้บริการเว็บ
( เช่น Apache แกน 2 ( ดูมาตรา 8 ) เพราะพื้นเมือง
jdk ไม่สนับสนุนสบู่บริการเว็บ . นอกจากนี้ Apache
httpclient ให้ประสิทธิภาพดีกว่าเพลงสำหรับฟังก์ชันเช่นการส่งคำขอ POST HTTP .
Apache httpclient ใช้ jsse เป็น sslsocketfactory
SSL เพื่อสร้างการเชื่อมต่อ ตามที่อธิบายไว้ในส่วนของ 4.1 นี้หมายความว่า
Apache httpclient ต้องแสดงชื่อโฮสต์ที่มีการถ่ายทอดของตัวเอง .
ไปสู่หลายช่องโหว่ในซอฟต์แวร์ตามเก่า
รุ่นใน httpclient ที่ไม่ได้ตรวจสอบโฮสต์เนมนั้นๆ ( มาตรา 7 ) .
นอกจากนี้ Apache httpclient ใช้
httphost ข้อมูลโครงสร้างอธิบาย HTTP ( s ) การเชื่อมต่อ httphost ไม่มีการตรวจสอบความสอดคล้องภายใน เช่น มันช่วยให้การเชื่อมต่อกับพอร์ต
เพื่อมี HTTP เป็นโครงการ ในส่วน 7.8 , เราแสดงวิธีการนี้จะนำไปสู่ข้อผิดพลาดในรหัส
ดำเนินการโดยผู้เชี่ยวชาญของ SSL .
weberknecht . weberknecht4
เป็นการนำ websockets โปรโตคอล มันใช้ sslsocketfactory แต่ไม่ได้แสดง
ของตัวเองชื่อโฮสต์ข้อมูลจึงไอออนบวก Java ใด ๆ โปรแกรมที่ใช้ weberknecht มีความเสี่ยงที่จะเป็นผู้ชายในการโจมตีกลาง .
ม้วน curl5
เป็นเครื่องมือที่นิยมและห้องสมุด ( libcurl ) สำหรับการเรียก
ข้อมูลจากเซิร์ฟเวอร์ระยะไกล . ตั้งแต่รุ่น 7.10 , Curl ตรวจสอบ SSL
certi จึง เคทส์ โดยค่าเริ่มต้น ภายใน ใช้ OpenSSL ตรวจสอบ
โซ่ของความไว้วางใจและถ่ายทอดข้อมูลและโฮสต์ตัวเอง ฟังก์ชันนี้คือ
ควบคุมโดย curlopt_ssl_verifypeer พารามิเตอร์ ( ค่าเริ่มต้น :
จริง ) และ curlopt_ssl_verifyhost ( ค่าเริ่มต้น : 2 ) .
อินเตอร์เฟซนี้จะประพฤติไม่ดี การ verifypeer เป็นค่าตรรกะ ในขณะที่ดูคล้าย verifyhost parameter
จำนวนเต็ม . ต่อไปนี้อ้างอิงจากคู่มือม้วนอธิบาย
ความหมายของ curlopt_ssl_verifyhost :
1 เพื่อตรวจสอบการมีอยู่ของชื่อสามัญใน SSL
เพื่อน certi จึงเคท 2 การตรวจสอบการมีอยู่ของชื่อสามัญ และยังยืนยันว่ามันตรงกับ
ชื่อโฮสต์ให้ ในสภาพแวดล้อมการผลิต ค่าของตัวเลือกนี้จะถูกเก็บไว้ที่
2 ( ค่าปริยาย ) .
ก็อาจมีนักพัฒนาไม่เพียง แต่ตรวจผิด
พารามิเตอร์เหล่านี้ แต่มักจะตั้ง curlopt_ssl_verify โฮสจริง
จึงเปลี่ยนไป จึงตั้งใจใช้ชื่อโฮสต์
1การถ่ายทอดข้อมูลกับผลร้าย ( ดูส่วน 7.1 ) .
PHP PHP มีหลายวิธีสำหรับการสร้าง SSL การเชื่อมต่อ ตัวอย่างเช่น fsockopen ซึ่งเปิดซ็อกเก็ตดิบ
เซิร์ฟเวอร์ระยะไกล สามารถใช้เชื่อมต่อกับเซิร์ฟเวอร์โดยใช้ SSL
" SSL : / / " ใน URL แม้ว่า fsockopen ไม่ได้ดำเนินการใด ๆ
certi จึงเคทตรวจสอบนักพัฒนาโปรแกรม PHP ตรวจ
แต่อย่างใดใช้มันเพื่อสร้างการเชื่อมต่อแบบ SSL ( ดูมาตรา 9 ) .
PHP ยังมีม้วนผูก ซึ่งใช้การตั้งค่าเริ่มต้นเพื่อสร้างการเชื่อมต่อ SSL
ม้วน certi จึงเหมาะสมกับเคท การตรวจสอบ ในฐานะที่เราแสดงในส่วน 7.1 , 7.2 , 7.3 และนักพัฒนาโปรแกรมมักจะตั้งค่าตัวเลือกหงิกอย่างไม่ถูกต้อง แทนการเริ่มต้นและการทำลาย certi จึงเคท
.
งูเหลือมหลายโมดูลหลามที่สามารถใช้สำหรับการจัดตั้งการเชื่อมต่อ
SSL urllib urllib2 , และ httplib เชื่อมต่อกับเซิร์ฟเวอร์ SSL
แต่ไม่ได้ตรวจสอบ certi จึงเคทส์ นี่คือเอกสารชัดเจนในกล่องสดใส
สีชมพูบน urllib หน้า : เตือนภัย 6
: เมื่อเปิด HTTPS URL ก็ไม่ได้
พยายามที่จะตรวจสอบเซิร์ฟเวอร์ certi จึงเคท ใช้ที่มีความเสี่ยงของคุณเอง
!
อย่างไรก็ตามแม้กระทั่งการใช้งานความปลอดภัยสูงประจำใช้โมดูลเหล่านี้
สร้างการเชื่อมต่อแบบ SSL ( ดูมาตรา 9 ) .
หลามยัง SSL โมดูล นี้โมดูลข้อมูลจึง es certi จึงเคทสาว แต่ไม่ใช่ชื่อเครื่อง โปรแกรมที่ต้องทำ
ของตัวเองชื่อโฮสต์ข้อมูลจึงไอออนบวก ใน Python 3 รุ่น SSL โมดูล
แนะนำวิธีการ match_hostname สำหรับชื่อโฮสต์ที่มีการถ่ายทอด
,แต่มันต้องชัดเจนเรียกโดยโปรแกรม
การแปล กรุณารอสักครู่..