1. Ưu điểm của SSL Pinning
Nếu được triển khai đúng cách, ghim SSL sẽ bổ sung các ưu điểm sau cho ứng dụng di động:
- Hạn chế đáng kể việc bị tấn công mạng
- Đã thêm bảo mật chống lại các chứng chỉ độc hại được sử dụng bởi tin tặc
- Đã thêm bảo vệ chống lại các lỗi của Tổ chức phát hành chứng chỉ, giả mạo hoặc Tổ chức phát hành chứng chỉ bị xâm phạm
- Đã thêm bảo mật chống lại phần mềm độc hại không có đặc quyền trong thiết bị
- Giảm chi phí vì chúng có thể sử dụng chứng chỉ tự ký
- Nâng cao quyền riêng tư của người dùng
2. Nhược điểm của ghim SSL
Dưới đây là một số nhược điểm của SSL Pinning:
- Ít linh hoạt – do không dễ thay đổi chứng chỉ đã ghim
- Không giống như bảo mật chuyển tiếp hoàn hảo, SSL Pinning không bảo vệ khi key của chứng chỉ được ghim bị xâm phạm
- Không giống như TSL, SSL Pinning không bảo vệ dữ liệu khi truyền qua mạng. Do đó, SSL Pinning không cung cấp tính bảo mật và bảo vệ toàn vẹn đối với các nút mạng không đáng tin cậy trong quá trình liên lạc
- Không bảo vệ chống lại kỹ thuật đảo ngược.
- Không bảo vệ cho thiết bị đã root.
3. Những thứ cần chuẩn bị?
- Kiến thức cơ bản về React Native
- Node 12 hoặc mới hơn — tốt nhất là LTS. Lưu ý, tốt nhất là cài đặt Node bằng NVM để tránh lỗi khi thiết lập môi trường phát triển React Native của bạn
- Phiên bản Android Studio mới nhất
- Bộ công cụ phát triển Java SE (JDK). React Native yêu cầu tối thiểu Java 8
4. cách triển khai chứng chỉ SSL trong React native ssl pinning
Trong phần này, chúng ta sẽ tìm hiểu cách triển khai ghim SSL trong ứng dụng React Native.
Đảm bảo rằng bạn đã thiết lập môi trường phát triển React Native của mình. Sao chép ứng dụng khởi động này để bắt đầu chạy:
git clone https://github.com/lawrenceagles/react-native-android-ssl-pinning-starter
Mở dự án của bạn trong trình soạn thảo và tạo một tệp trong thư mục Android. Thêm phần sau vào tệp này:local.properties
sdk.dir = /home/<!-- your pc name here -->/Android/Sdk
npx react-native start
npx react-native run-android
Ứng dụng dành cho người mới bắt đầu bao gồm một bản soạn sẵn đơn giản với hai nút: fetch data
và fetch secured data
. Nhấp vào các nút này sẽ gọi ra hai chức năng (như bạn có thể đoán): fetchData
và secureFetchData
. Hiện tại, các chức năng này chỉ ghi một văn bản vào bảng điều khiển mà bạn có thể thấy trong thiết bị đầu cuối Metro của mình.
5. Triển khai cài đặt chứng chỉ SSL Pining
Đầu tiên, cài đặt gói ghim react-native-ssl bằng cách chạy:
npm install react-native-ssl-pinning
Để nhận chứng chỉ, hãy mở thiết bị đầu cuối của bạn và chạy đoạn mã sau:
openssl s_client -servername jsonplaceholder.typicode.com -connect jsonplaceholder.typicode.com:443 </dev/null | sed -n -e '/-.BEGIN/,/-.END/ p' > mycert.pem
Đoạn mã trên sẽ xuất chứng chỉ của jsonplaceholder
và lưu nó vào một tệp — . Nhưng chúng tôi cần chứng chỉ trong một tệp để chuyển đổi nó từ thành , vì vậy hãy chạy đoạn mã sau:.pem
mycer.pm
.cer
.pem
.cer
openssl x509 -in mycert.pem -outform der -out mycert.cer
Và sao chép tệp vào thư mục ứng dụng của bạn .mycert.cer
/android/app/src/main/assets/
Để lấy chứng chỉ không hợp lệ, chúng tôi sẽ lấy chứng chỉ đã hết hạn từ https://expired.badssl.com/ .
Trong thiết bị đầu cuối của bạn, hãy chạy đoạn mã sau:
openssl x509 -in expcert.pem -outform der -out expcert.cer
Sau đó, thêm tệp vào thư mục của bạn.expcert.cer
/android/app/src/main/assets/
Bây giờ, chúng ta có thể cấu trúc lại các chức năng fetchData
và securedFetchData
để sử dụng chứng chỉ này bằng cách sử dụng gói.react-native-ssl-pinning
Nhập gói này vào tệp của bạn bằng dòng mã:App.js
import { fetch } from 'react-native-ssl-pinning';
Thay thế fetchData
chức năng bằng mã này:
const fetchData = () => {
fetch("https://jsonplaceholder.typicode.com/posts/1", {
method: "GET",
timeoutInterval: 10000,
sslPinning: {
certs: ["expcert"]
}
})
.then(response => {
console.log(JSON.stringify(response.bodyString, null, "\t"))
})
.catch(err => {
console.log(`error: ${err}`)
});
}
Ngoài ra, thay thế securedFetchDatachức năng bằng đoạn mã sau:
const secureFetchData = () => {
fetch("https://jsonplaceholder.typicode.com/posts/1", {
method: "GET",
timeoutInterval: 10000,
sslPinning: {
certs: ["mycert"]
}
})
.then(response => {
console.log(JSON.stringify(response.bodyString, null, "\t"))
})
.catch(err => {
console.log(`error: ${err}`)
})
}
Trong đoạn mã trên, chúng tôi đã cập nhật các hàm fetchData
và securedFetchData
để tìm nạp dữ liệu bằng cách sử dụng phương thức từ tệp . Phương thức này nhận một tùy chọn, là một đối tượng có thuộc tính. Thuộc tính là một mảng của tất cả các chứng chỉ của chúng tôi.jsonplaceholder.typicode.com
fetch
react-native-ssl-pinning
fetch
sslPinning
cert
cert
Trong chúng fetchData
tôi đã thêm expcert
chứng chỉ. Vì vậy, kết nối không nên được thiết lập. Nhưng trong securedFetchData
chức năng, chúng tôi đã thêm mycert
chứng chỉ, đây là chứng chỉ đáng tin cậy, vì vậy kết nối sẽ được thiết lập. Và chúng tôi sẽ có thể lấy dữ liệu từ .jsonplaceholder.typicode.com
Để kiểm tra điều này, chúng tôi cần xây dựng lại ứng dụng của mình bằng cách chạy:
npx react-native run-android
Bây giờ bấm vào nút và kiểm tra nhà ga Metro. Chúng tôi nhận được:Fetch secured data
Chúng ta có thể thấy từ hình ảnh rằng dữ liệu đã được tìm nạp thành công.
Bây giờ hãy nhấp vào nút và kiểm tra nhật ký trong nhà ga Metro. Chúng tôi nhận được lỗi này: .Fetch data
LOG error: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found
Lỗi này phát sinh do chúng tôi sử dụng chứng chỉ đã hết hạn. Chứng chỉ SSL hết hạn theo thời gian và điều này là vì lý do bảo mật
OK vậy là đã xong – chúc các bạn thành công.
>>>> SSl Pinning android là gì? Cách fix SSL Pinning Android