Tháng 6 năm 2007
- Giới thiệu
- Ví dụ: Truy xuất nguồn cấp dữ liệu công khai
- tcpdump
- WireShark
- Vấn đề: SSL và mã hoá
- Fiddler
- Lời kết
Giới thiệu
Việc phát triển các ứng dụng tương tác với dịch vụ web đặt ra một loạt vấn đề riêng biệt. Một nguyên nhân thường gặp gây ra sự khó chịu là không biết chính xác thông báo nào đã được gửi đến máy chủ hoặc phản hồi nào đã được nhận. Một số lỗi khó theo dõi nhất là do sự khác biệt giữa những gì chúng ta nghĩ là đang gửi đến máy chủ và những gì thực sự đang truyền qua mạng.
Bài viết này giới thiệu một số công cụ có thể giúp dữ liệu trên dây dễ thấy và hữu ích hơn. Thường được gọi là "trình theo dõi gói", những công cụ này ghi lại tất cả các gói mạng di chuyển qua giao diện mạng của bạn. Việc kiểm tra nội dung của các gói này và thứ tự gửi và nhận có thể là một kỹ thuật gỡ lỗi hữu ích.
Ví dụ: Truy xuất nguồn cấp dữ liệu công khai
Tôi đang thành lập một đội đạp xe cho một chuyến đạp xe từ thiện và đã tạo một lịch cho các sự kiện như buổi cung cấp thông tin, hoạt động gây quỹ của đội và các chuyến đạp xe huấn luyện. Tôi đã đặt lịch này ở chế độ công khai để các thành viên trong nhóm và những người đi xe khác có thể xem lịch và tham gia các sự kiện. Tôi cũng muốn gửi bản tin về các sự kiện sắp tới. Thay vì sao chép thông tin từ trang web Lịch Google, tôi có thể sử dụng API dữ liệu Lịch Google để truy vấn lịch này và truy xuất các sự kiện.
Tài liệu về Google Calendar API có thông tin về cách sử dụng Google Data API dựa trên REST để tương tác với lịch của tôi theo cách lập trình. (Lưu ý của người biên tập: kể từ phiên bản 3, API Lịch Google không còn sử dụng định dạng Dữ liệu của Google nữa.) Việc đầu tiên bạn cần làm là lấy URL nguồn cấp dữ liệu sự kiện của lịch bằng cách nhấp vào nút trên trang cài đặt lịch:
http://www.google.com/calendar/feeds/24vj3m5pl125bh2ijbbneh953s%40group.calendar.google.com/public/basic
Dựa vào tài liệu về Lịch Google, tôi có thể truy xuất và hiển thị các sự kiện trên lịch như thế này, trong đó PUBLIC_FEED_URL
chứa URL nguồn cấp dữ liệu sự kiện.
CalendarService myService = new CalendarService("exampleCo-fiddlerExample-1"); final String PUBLIC_FEED_URL = "http://www.google.com/calendar/feeds/24vj3m5pl125bh2ijbbneh953s%40group.calendar.google.com/public/basic"; URL feedUrl = new URL(PUBLIC_FEED_URL); CalendarEventFeed resultFeed = myService.getFeed(feedUrl, CalendarEventFeed.class); System.out.println("All events on your calendar:"); for (int i = 0; i < resultFeed.getEntries().size(); i++) { CalendarEventEntry entry = resultFeed.getEntries().get(i); System.out.println("\t" + entry.getTitle().getPlainText()); } System.out.println();
Thao tác này sẽ tạo ra một danh sách cơ bản gồm các sự kiện trên lịch của tôi:
All events on your calendar: MS150 Training ride Meeting with Nicole MS150 Information session
Đoạn mã trên hiển thị tiêu đề của các sự kiện trên lịch, nhưng còn những dữ liệu khác mà chúng ta nhận được từ máy chủ thì sao? Thư viện ứng dụng Java không giúp bạn dễ dàng xuất một nguồn cấp dữ liệu hoặc mục nhập dưới dạng XML, và ngay cả khi làm được, XML cũng không phải là toàn bộ câu chuyện. Còn tiêu đề HTTP đi kèm với yêu cầu thì sao? Truy vấn có được chuyển hướng hoặc chuyển tiếp không? Với các thao tác phức tạp hơn, những câu hỏi này ngày càng trở nên quan trọng, đặc biệt là khi có lỗi xảy ra. Phần mềm theo dõi gói dữ liệu có thể trả lời những câu hỏi này bằng cách cho thấy lưu lượng truy cập mạng.
tcpdump
tcpdump là một công cụ dòng lệnh hoạt động trên các nền tảng giống Unix, nhưng cũng có một cổng Windows tên là WinDump. Giống như hầu hết các trình theo dõi gói, tcpdump đặt thẻ mạng của bạn ở chế độ tuỳ ý. Chế độ này yêu cầu đặc quyền siêu người dùng. Để sử dụng tcpdump, bạn chỉ cần chỉ định giao diện mạng để lắng nghe và lưu lượng truy cập mạng sẽ được gửi đến stdout:
sudo tcpdump -i eth0
Nếu chạy lệnh này, bạn sẽ bị tấn công bởi đủ loại lưu lượng truy cập mạng, một số lưu lượng truy cập mà bạn thậm chí sẽ không nhận ra. Bạn chỉ cần chuyển tiếp đầu ra đến một tệp và grep sau đó, nhưng điều này có thể dẫn đến một số tệp rất lớn. Hầu hết phần mềm chụp gói đều có sẵn một số cơ chế lọc để bạn chỉ chụp những gì mình cần.
tcpdump hỗ trợ lọc dựa trên nhiều đặc điểm của lưu lượng truy cập mạng. Ví dụ: bạn có thể yêu cầu tcpdump chỉ ghi lại lưu lượng truy cập đến hoặc đi từ máy chủ của bạn trên cổng 80 (thông báo HTTP) bằng cách chèn tên máy chủ của bạn vào biểu thức sau:
dst or src host <hostname> and port 80
Đối với mỗi gói khớp với biểu thức bộ lọc, tcpdump sẽ hiển thị dấu thời gian, nguồn và đích đến của gói, cũng như một số cờ TCP. Thông tin này có thể có giá trị vì cho biết thứ tự gửi và nhận các gói.
Bạn cũng nên xem nội dung của các gói. Cờ "-A" yêu cầu tcpdump in từng gói ở định dạng ASCII, hiển thị tiêu đề HTTP và nội dung thư. Cờ "-s" được dùng để chỉ định số lượng byte cần hiển thị (trong đó "-s 0" có nghĩa là không cắt bớt nội dung thông báo).
Khi kết hợp tất cả lại với nhau, chúng ta sẽ có lệnh sau:
sudo tcpdump -A -s 0 -i eth0 dst or src host <hostname> and port 80
Nếu chạy lệnh này, sau đó thực thi ví dụ ngắn về .Java ở trên, bạn sẽ thấy tất cả hoạt động giao tiếp mạng liên quan đến thao tác này. Trong số lưu lượng truy cập, bạn sẽ thấy yêu cầu HTTP GET
:
22:22:30.870771 IP dellalicious.mshome.net.4520 > po-in-f99.google.com.80: P 1:360(359) ack 1 win 65535 E.....@....\...eH..c...P.=.....zP......GET /calendar/feeds/24vj3m5pl125bh2ijbbneh953s%40group.calendar.google.com/public/basic HTTP/1.1 User-Agent: exampleCo-fiddlerExample-1 GCalendar-Java/1.0.6 GData-Java/1.0.10(gzip) Accept-Encoding: gzip Cache-Control: no-cache Pragma: no-cache Host: www.google.com Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Connection: keep-alive
Bạn cũng sẽ thấy thông báo phản hồi 200 OK
chứa nguồn cấp dữ liệu của Google. Xin lưu ý rằng nguồn cấp dữ liệu được chia thành 4 gói:
22:22:31.148789 IP po-in-f99.google.com.80 > dellalicious.mshome.net.4520: . 1:1431(1430) ack 360 win 6432 E...1 ..2.I.H..c...e.P.....z.=.:P..M...HTTP/1.1 200 OK Content-Type: application/atom+xml; charset=UTF-8 Cache-Control: max-age=0, must-revalidate, private Last-Modified: Mon, 11 Jun 2007 15:11:40 GMT Transfer-Encoding: chunked Date: Sun, 24 Jun 2007 02:22:10 GMT Server: GFE/1.3 13da <?xml version='1.0' encoding='UTF-8'?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:gCal='http://sc hemas.google.com/gCal/2005' xmlns:gd='http://schemas.google.com/g/2005'><id>http ://www.google.com/calendar/feeds/24vj3m5pl125bh2ijbbneh953s%40group.calendar.goo gle.com/public/basic</id><updated>2007-06-11T15:11:40.000Z</updated><category sc heme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2 005#event'></category><title type='text'>MS150 Training Schedule</title><subtitl e type='text'>This calendar is public</subtitle><link rel='http://schemas.google .com/g/2005#feed' type='application/atom+xml' href='http://www.google.com/calend ar/feeds/24vj3m5pl125bh2ijbbneh953s%40group.calendar.google.com/public/basic'></ link><link rel='self' type='application/atom+xml' href='http://www.google.com/ca lendar/feeds/24vj3m5pl125bh2ijbbneh953s%40group.calendar.google.com/public/basic ?max-results=25'></link><author><name>Lane LiaBraaten</name><email>api.lliabraa@ gmail.com</email></author><generator version='1.0' uri='http://www.google.com/ca lendar'>Google Calendar</generator><openSearch:totalRe 22:22:31.151501 IP po-in-f99.google.com.80 > dellalicious.mshome.net.4520: . 1431:2861(1430) ack 360 win 6432 E...1!..2.I.H..c...e.P.......=.:P.. 2...sults>3</openSearch:totalResults><openSe arch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch :itemsPerPage><gd:where valueString=''></gd:where><gCal:timezone value='America/ Los_Angeles'></gCal:timezone><entry><id>http://www.google.com/calendar/feeds/24v j3m5pl125bh2ijbbneh953s%40group.calendar.google.com/public/basic/dgt40022cui2k3j 740hnj46744</id><published>2007-06-11T15:11:05.000Z</published><updated>2007-06- 11T15:11:05.000Z</updated><category scheme='http://schemas.google.com/g/2005#kin d' term='http://schemas.google.com/g/2005#event'></category><title type='text'>M S150 Training ride</title><summary type='html'>When: Sat Jun 9, 2007 7am to 10am &nbsp; PDT<br> <br>Event Status: confirmed</summary><conte nt type='text'>When: Sat Jun 9, 2007 7am to 10am&nbsp; PDT<br> <b r>Event Status: confirmed</content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/event?eid=ZGd0NDAwMjJjdWkyazNqNzQwaG5qNDY3 NDQgMjR2ajNtNXBsMTI1YmgyaWpiYm5laDk1M3NAZw' title='alternate'></link><link rel=' self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/24v j3m5pl125bh2ijbbneh953s%40group.calendar.google.com/public/basic/dgt40022cui2k3j 740hnj46744'></link><author><name>MS150 Training Schedule</name></author><gCal:s endEventNotifications value='false'></gCal:sendEventNotifications></entry><entry ><id>http://www.google.com/cal 22:22:31.153097 IP po-in-f99.google.com.80 > dellalicious.mshome.net.4520: . 2861:4291(1430) ack 360 win 6432 E...1#..2.I.H..c...e.P.......=.:P.. ....endar/feeds/24vj3m5pl125bh2ijbbneh953s%4 0group.calendar.google.com/public/basic/51d8kh4s3bplqnbf1lp6p0kjp8</id><publishe d>2007-06-11T15:08:23.000Z</published><updated>2007-06-11T15:10:39.000Z</updated ><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.g oogle.com/g/2005#event'></category><title type='text'>Meeting with Nicole</title ><summary type='html'>When: Mon Jun 4, 2007 10am to 11am&nbsp; PDT<br> <br>Where: Conference Room B <br>Event Status: confirmed</summ ary><content type='text'>When: Mon Jun 4, 2007 10am to 11am&nbsp; PDT<br& gt; <br>Where: Conference Room B <br>Event Status: confirmed <br>Event Description: Discuss building cycling team for MS150</content><l ink rel='alternate' type='text/html' href='http://www.google.com/calendar/event? eid=NTFkOGtoNHMzYnBscW5iZjFscDZwMGtqcDggMjR2ajNtNXBsMTI1YmgyaWpiYm5laDk1M3NAZw' title='alternate'></link><link rel='self' type='application/atom+xml' href='http ://www.google.com/calendar/feeds/24vj3m5pl125bh2ijbbneh953s%40group.calendar.goo gle.com/public/basic/51d8kh4s3bplqnbf1lp6p0kjp8'></link><author><name>MS150 Trai ning Schedule</name></author><gCal:sendEventNotifications value='false'></gCal:s endEventNotifications></entry><entry><id>http://www.google.com/calendar/feeds/24 vj3m5pl125bh2ijbbneh953s%40group.calendar.google.com/public/basic/va41amq3r08dhh kpm3lc1abs2o</id><published>20 22:22:31.190244 IP po-in-f99.google.com.80 > dellalicious.mshome.net.4520: P 4291:5346(1055) ack 360 win 6432 E..G1$..2.K.H..c...e.P.....<.=.:P.. ....07-06-11T15:10:08.000Z</published><updat ed>2007-06-11T15:10:08.000Z</updated><category scheme='http://schemas.google.com /g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title ty pe='text'>MS150 Information session</title><summary type='html'>When: Wed Jun 6, 2007 4pm to Wed Jun 6, 2007 5pm&nbsp; PDT<br> <br>Event Statu s: confirmed</summary><content type='text'>When: Wed Jun 6, 2007 4pm to Wed Jun 6, 2007 5pm&nbsp; PDT<br> <br>Event Status: confirmed< /content><link rel='alternate' type='text/html' href='http://www.google.com/cale ndar/event?eid=dmE0MWFtcTNyMDhkaGhrcG0zbGMxYWJzMm8gMjR2ajNtNXBsMTI1YmgyaWpiYm5la Dk1M3NAZw' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/24vj3m5pl125bh2ijbbneh953s%40group.c alendar.google.com/public/basic/va41amq3r08dhhkpm3lc1abs2o'></link><author><name >MS150 Training Schedule</name></author><gCal:sendEventNotifications value='fals e'></gCal:sendEventNotifications></entry></feed>
Đầu ra này bao gồm tất cả tiêu đề và nội dung HTTP, cũng như một số cờ TCP khó hiểu. Tất cả dữ liệu đều có ở đây, nhưng hơi khó đọc và hiểu. Có một số công cụ đồ hoạ giúp bạn dễ dàng xem dữ liệu này.
WireShark (trước đây là Ethereal)

WireShark hiển thị lưu lượng truy cập mạng theo nhiều cách.
WireShark là một công cụ đồ hoạ được tạo bằng libpcap (cũng là thư viện mà tcpdump được tạo trên đó) và có trên Linux, Mac OS X và Windows. GUI của WireShark cho phép một số cách mới để diễn giải và tương tác với dữ liệu chụp gói. Ví dụ: khi các gói được thu thập từ giao diện mạng, chúng sẽ xuất hiện bằng nhiều màu dựa trên giao thức mà chúng đang sử dụng. Bạn cũng có thể sắp xếp lưu lượng truy cập theo dấu thời gian, nguồn, đích đến và giao thức.
Nếu bạn chọn một hàng trong danh sách các gói, Wireshark sẽ hiển thị IP, TCP và thông tin cụ thể khác về giao thức trong tiêu đề gói ở dạng cây dễ đọc. Dữ liệu cũng xuất hiện ở định dạng HEX và ASCII ở cuối màn hình.
Mặc dù bản chất trực quan của WireShark giúp bạn dễ dàng hiểu được lưu lượng truy cập mạng, nhưng trong hầu hết các trường hợp, bạn vẫn nên lọc lưu lượng truy cập mạng. WireShark có khả năng lọc mạnh mẽ, bao gồm cả khả năng hỗ trợ hàng trăm giao thức.
LƯU Ý: Để xem các giao thức có sẵn và tạo bộ lọc phức tạp, hãy nhấp vào nút ở gần đầu cửa sổ WireShark.
Để tạo lại bộ lọc được dùng trong ví dụ tcpdump ở trên, bạn có thể chèn biểu thức sau vào hộp bộ lọc WireShark:
ip.addr==<your IP address> && tcp.port==80
Hoặc tận dụng kiến thức của WireShark về HTTP:
ip.addr==<your IP address> && http
Thao tác này sẽ lọc kết quả của quá trình ghi lại để chỉ lấy các gói liên quan đến hoạt động tương tác này với máy chủ Google Lịch. Bạn có thể nhấp vào từng gói để xem nội dung và ghép các gói lại với nhau để xem giao dịch.
LƯU Ý: Bạn có thể nhấp chuột phải vào một trong các gói rồi chọn "Follow TCP Stream" (Theo luồng TCP) để hiển thị các yêu cầu và phản hồi theo trình tự trong một cửa sổ duy nhất.
WireShark cung cấp một số cách để lưu thông tin chụp. Bạn có thể lưu một, một số hoặc tất cả các gói. Nếu đang xem một luồng TCP, bạn chỉ cần nhấp vào nút "Lưu dưới dạng" để chỉ lưu các gói có liên quan. Bạn cũng có thể nhập đầu ra từ một quá trình ghi tcpdump và xem đầu ra đó trong WireShark.
Vấn đề: SSL và mã hoá
Một điểm yếu thường gặp của các công cụ ghi lại gói là không thể xem dữ liệu được mã hoá qua kết nối SSL. Ví dụ trên truy cập vào một nguồn cấp dữ liệu công khai, nên không cần SSL. Tuy nhiên, nếu ví dụ truy cập vào một nguồn cấp dữ liệu riêng tư, thì ứng dụng sẽ cần xác thực bằng dịch vụ xác thực của Google, dịch vụ này yêu cầu kết nối SSL.
Đoạn mã sau tương tự như ví dụ trước, nhưng ở đây CalendarService
yêu cầu người dùng cung cấp nguồn cấp dữ liệu meta về lịch. Đây là một nguồn cấp dữ liệu riêng tư và yêu cầu xác thực. Để xác thực, bạn chỉ cần gọi phương thức setUserCredentials
. Phương thức này kích hoạt một yêu cầu HTTPS đến dịch vụ ClientLogin và lấy mã xác thực từ phản hồi. Sau đó, đối tượng CalendarService
sẽ bao gồm mã xác thực trong tất cả các yêu cầu tiếp theo.
CalendarService myService = new CalendarService("exampleCo-fiddlerSslExample-1"); myService.setUserCredentials(username, userPassword); final String METAFEED_URL = "http://www.google.com/calendar/feeds/default"; URL feedUrl = new URL(METAFEED_URL); CalendarFeed resultFeed = myService.getFeed(feedUrl, CalendarFeed.class); System.out.println("Your calendars:"); for (int i = 0; i < resultFeed.getEntries().size(); i++) { CalendarEntry entry = resultFeed.getEntries().get(i); System.out.println("\t" + entry.getTitle().getPlainText()); } System.out.println();
Hãy xem xét lưu lượng truy cập mạng cần thiết để xác thực và truy cập vào một nguồn cấp dữ liệu API Google Data riêng tư:
- Gửi thông tin đăng nhập của người dùng đến dịch vụ ClientLogin
- Gửi một yêu cầu HTTP
POST
đến https://www.google.com/accounts/ClientLogin với các tham số sau trong nội dung thông báo:- Email – địa chỉ email của người dùng.
- Passwd – mật khẩu của người dùng.
- source – xác định ứng dụng khách của bạn. Phải có dạng companyName-applicationName-versionID. Các ví dụ này sử dụng tên ExampleCo-FiddlerSSLExample-1.
- service – tên dịch vụ Lịch Google là "cl".
- Gửi một yêu cầu HTTP
- Nhận mã thông báo uỷ quyền
- Nếu yêu cầu xác thực không thành công, bạn sẽ nhận được mã trạng thái HTTP 403 Forbidden.
- Nếu thành công, phản hồi từ dịch vụ sẽ là mã trạng thái HTTP 200 OK, cộng với 3 mã chữ và số dài trong nội dung phản hồi:
SID
,LSID
vàAuth
. Giá trịAuth
là mã thông báo uỷ quyền.
- Yêu cầu nguồn cấp dữ liệu meta cho lịch riêng tư
- Gửi yêu cầu HTTP
GET
đến http://www.google.com/calendar/feeds/default bằng tiêu đề sau:
Authorization: GoogleLogin auth=<yourAuthToken>
- Gửi yêu cầu HTTP
Hãy thử chạy đoạn mã này và xem lưu lượng truy cập mạng trong WireShark (sử dụng "http || ssl" làm bộ lọc). Bạn sẽ thấy các gói SSL và TLS liên quan đến giao dịch, nhưng các gói yêu cầu và phản hồi ClientLogin được mã hoá trong các gói "Dữ liệu ứng dụng". Đừng lo lắng, tiếp theo chúng ta sẽ xem xét một công cụ có thể tiết lộ thông tin đã mã hoá này.
Fiddler
Fiddler là một công cụ khác để theo dõi gói dữ liệu bằng giao diện đồ hoạ, nhưng hoạt động khá khác so với các công cụ đã trình bày cho đến nay. Fiddler đóng vai trò là một proxy giữa ứng dụng của bạn và các dịch vụ từ xa mà bạn đang tương tác, trở thành một người trung gian. Fiddler thiết lập kết nối SSL với cả ứng dụng và dịch vụ web từ xa, giải mã lưu lượng truy cập từ một điểm cuối, ghi lại văn bản thuần tuý và mã hoá lại lưu lượng truy cập trước khi gửi đi. Rất tiếc, Fiddler chỉ có trên Windows. Xin lỗi tất cả người dùng Mac và Linux.
Lưu ý: Để hỗ trợ SSL, bạn cần có Fiddler phiên bản 2 và .NET Framework phiên bản 2.0.
Bạn chủ yếu xem lưu lượng truy cập mạng trong Fiddler thông qua thẻ Session Inspector (Công cụ kiểm tra phiên). Các thẻ phụ hữu ích nhất để gỡ lỗi liên quan đến Google Data API là:
- Tiêu đề – cho biết tiêu đề HTTP ở định dạng cây có thể thu gọn.
- Auth – cho biết các tiêu đề Xác thực.
- Raw (Thô) – cho biết nội dung của các gói mạng ở dạng văn bản ASCII
LƯU Ý: Nhấp vào biểu tượng ở góc dưới bên trái của cửa sổ Fiddler để bật và tắt tính năng ghi lại.
Fiddler sử dụng .NET Framework để định cấu hình các kết nối mạng nhằm sử dụng Fiddler làm proxy. Điều này có nghĩa là mọi kết nối bạn thực hiện bằng Internet Explorer hoặc bằng mã .NET sẽ xuất hiện trong Fiddler theo mặc định. Tuy nhiên, lưu lượng truy cập từ mẫu Java ở trên sẽ không xuất hiện vì Java có một cách thiết lập proxy HTTP khác.
Trong Java, bạn có thể thiết lập proxy HTTP bằng cách sử dụng các thuộc tính hệ thống. Fiddler chạy trên cổng 8888, vì vậy, đối với một bản cài đặt cục bộ, bạn có thể làm cho mã Java sử dụng Fiddler làm proxy cho HTTP và HTTPS bằng cách thêm các dòng sau:
System.setProperty("http.proxyHost", "localhost"); System.setProperty("http.proxyPort", "8888"); System.setProperty("https.proxyHost", "localhost"); System.setProperty("https.proxyPort", "8888");
Nếu chạy mẫu bằng các dòng này, bạn sẽ thực sự nhận được một dấu vết ngăn xếp khó chịu từ gói bảo mật Java:
[java] Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Fiddler có thể giải mã và hiển thị lưu lượng truy cập SSL.
Lỗi này xảy ra khi không xác minh được chứng chỉ do máy chủ trả về trong một kết nối SSL. Trong trường hợp này, chứng chỉ không hợp lệ đến từ Fiddler, đóng vai trò là một kẻ tấn công xen giữa. Fiddler tạo chứng chỉ ngay lập tức và vì Fiddler không phải là một tổ chức phát hành đáng tin cậy, nên những chứng chỉ này sẽ khiến Java không thiết lập được kết nối SSL.
Lưu ý: Khi Fiddler đang chạy, mọi kết nối SSL mà bạn thực hiện trong Internet Explorer sẽ kích hoạt "Cảnh báo bảo mật" hỏi xem bạn có muốn tiếp tục mặc dù chứng chỉ không đáng tin cậy hay không. Bạn có thể nhấp vào "View Certificate" (Xem chứng chỉ) để xem chứng chỉ mà Fiddler đã tạo.
Vậy làm cách nào để bạn có thể vượt qua trường hợp ngoại lệ bảo mật này? Về cơ bản, bạn cần định cấu hình lại khung bảo mật của Java để tin cậy tất cả các chứng chỉ. May mắn thay, bạn không cần phải phát minh lại bánh xe ở đây – hãy xem giải pháp của Francis Labrie và thêm phương thức SSLUtilities.trustAllHttpsCertificates()
vào ví dụ ở trên.
Sau khi định cấu hình Java để dùng Fiddler làm proxy và tắt quy trình xác minh chứng chỉ mặc định, bạn có thể chạy ví dụ và xem tất cả lưu lượng truy cập được gửi qua mạng ở dạng văn bản thuần tuý. Đừng đánh cắp mật khẩu của tôi!
Xin lưu ý rằng giao dịch xác thực này chỉ là một ví dụ nhỏ về lưu lượng truy cập SSL. Một số ứng dụng web chỉ sử dụng các kết nối SSL, vì vậy, việc gỡ lỗi lưu lượng truy cập HTTP là không thể nếu không có cách nào để giải mã dữ liệu.
Kết luận
tcpdump có trên Linux, Mac OS X và Windows, đồng thời là một công cụ tuyệt vời khi bạn biết mình đang tìm kiếm điều gì và chỉ cần chụp nhanh. Tuy nhiên, có một số công cụ đồ hoạ trình bày lưu lượng truy cập mạng ở những định dạng dễ hiểu hơn. tcpdump có nhiều lựa chọn và khả năng lọc hơn so với những lựa chọn và khả năng đã được đề cập ở đây. Để xem nội dung mô tả đầy đủ về chức năng của tcpdump, hãy nhập "man tcpdump" hoặc truy cập vào trang hướng dẫn tcpdump trực tuyến.
WireShark cũng có trên Linux, Mac OS X và Windows. Nhờ hỗ trợ sẵn hàng trăm giao thức, WireShark là một công cụ hữu ích cho nhiều ứng dụng, chứ không chỉ gỡ lỗi HTTP. Phần giới thiệu này chỉ đề cập đến một số ít trong số nhiều chức năng của WireShark. Để biết thêm thông tin, hãy nhập "man wireshark" hoặc truy cập vào trang web của WireShark.
Fiddler cũng có nhiều tính năng tuyệt vời, nhưng điểm khác biệt của công cụ này là khả năng giải mã lưu lượng truy cập SSL. Để biết thêm thông tin, hãy truy cập vào trang web Fiddler2.
Những ứng dụng theo dõi gói này là những công cụ hữu ích mà bạn nên có trong bộ công cụ của mình. Những độc giả tinh ý sẽ nhận thấy rằng tất cả những ứng dụng này đều miễn phí! Lần tới khi bạn làm việc với Google API và thấy có điều gì đó bất thường, hãy sử dụng một trong những trình phân tích mạng này và xem xét kỹ hơn những gì đang diễn ra. Nếu không tìm thấy vấn đề, bạn luôn có thể đăng câu hỏi lên nhóm thảo luận của chúng tôi. Việc thêm các thông báo mạng có liên quan sẽ giúp người khác hiểu và chẩn đoán vấn đề cụ thể của bạn.
Chúc bạn may mắn và có những giây phút khám phá vui vẻ!