Certificate Pinning — mekanismo ng pag-pin ng sertipiko o pampublikong susi ng server, kung saan gumagamit ang app ng paunang alam na fingerprint upang i-verify ang HTTPS na koneksyon. Hindi tulad ng karaniwang chain of trust sa pamamagitan ng CA, ginagarantiya ng pinning na kahit isang nakompromisong certificate authority ay hindi makakapag-isyu ng pekeng sertipiko para sa iyong domain. Ayon sa OWASP MSTG (2025), ang Certificate Pinning ay kasama sa listahan ng mga mandatoryong kontrol para sa mga app na may antas ng proteksyon na L2. Kasama sa implementasyon ang pag-iimbak ng mga hash ng sertipiko sa code at pag-verify sa bawat kahilingan.
Mga Pangunahing Punto
Certificate Pinning — ay isang teknik sa seguridad kung saan iniimbak ng app ang fingerprint ng isang pinagkakatiwalaang sertipiko at ginagamit ito bilang tanging pamantayan para magtatag ng HTTPS na koneksyon. Sa karaniwang modelo ng TLS, sinusuri ng kliyente kung ang sertipiko ng server ay nilagdaan ng isang pinagkakatiwalaang root CA — alinman sa daan-daang pre-install na awtoridad sa system. Pinapalitan ng Certificate Pinning ang chain na ito ng direktang pagsusuri: ang sertipiko ay dapat tumugma sa naka-imbak na sample o naglalaman ng inaasahang pampublikong susi.
Ang problema ng karaniwang modelo ay naging halata pagkatapos ng mga insidente ng kompromiso ng CA — DigiNotar (2011), Comodo (2011), TrustCor (2022). Kung ang CA ay nag-isyu ng pekeng sertipiko para sa iyong domain, tatanggapin ito ng browser o app bilang wasto. Certificate Pinning ay pumipigil sa pag-atake na ito: kahit isang perpektong nilagdaang pekeng sertipiko ay tatanggihan, dahil ang fingerprint nito ay hindi tumutugma sa naka-pin sa app.
Ang terminong pinning ay nagmula sa pin — “aspili” o “panali”: inaayos ng developer ang pinagkakatiwalaang sertipiko, at anumang paglihis dito ay humaharang sa koneksyon. Ayon sa pananaliksik ng Mitre CWE-295, ang hindi tamang pag-validate ng sertipiko ay nananatiling isa sa top-10 pinakadelikadong pagkakamali sa seguridad sa mobile apps, at ang Certificate Pinning ay direktang paraan upang maiwasan ito.
Sa simula, ginamit ang Certificate Pinning sa mga browser sa pamamagitan ng mekanismong HPKP (HTTP Public Key Pinning), na na-standardize sa RFC 7469. Nagpadala ang developer ng HTTP header na Public-Key-Pins na may mga hash ng inaasahang susi, at naaalala sila ng browser para sa isang tinukoy na panahon. Gayunpaman, napatunayang mapanganib ang HPKP: isang pagkakamali sa configuration ay maaaring humarang sa site nang ilang buwan. Noong 2018, itinigil ng Chrome ang suporta para sa HPKP, at ngayon ang pamantayan ay software implementasyon sa panig ng kliyente — sa loob ng mobile app o browser extension.
Ang proseso ng Certificate Pinning ay may kasamang tatlong pangunahing yugto: pagkalkula ng fingerprint, pag-verify sa koneksyon, at paghawak ng error. Sa yugto ng paghahanda, nakukuha ng developer ang SHA-256 hash ng sertipiko o pampublikong susi ng production server. Para sa mga app na sumusunod sa GDPR at PCI DSS, kinakailangan din na i-pin ang mga fingerprint ng mga intermediate na CA sa chain.
Sa bawat HTTPS na kahilingan, naharang ng app ang TLS authentication callback, kinukuha ang sertipiko ng server, at kinakalkula ang SHA-256 hash nito. Ang hash na ito ay inihambing sa naka-imbak na listahan ng mga pinagkakatiwalaang fingerprint. Kung may natagpuang tugma — magpapatuloy ang koneksyon. Kung wala — dapat putulin ng app ang koneksyon at iulat ang error, nang hindi isinasapubliko ang mga detalye ng implementasyon sa umaatake.
fun validateCertificate(certificate: X509Certificate,
expectedHash: String): Boolean {
val digest = MessageDigest.getInstance("SHA-256")
val hash = Base64.encodeToString(
digest.digest(certificate.publicKey.getEncoded()),
Base64.DEFAULT
).trim()
return hash == expectedHash
}
Tumatanggap ang function ng X509Certificate object mula sa server at inaasahang hash. Una, kinukuha ang pampublikong susi ng sertipiko, kinakalkula ang SHA-256 hash at naka-encode sa Base64. Ang resulta ay inihambing sa inaasahang fingerprint. Sa produksyon, makabubuting magdagdag ng pagsusuri sa isang array ng 2–3 fingerprint para suportahan ang rotasyon.
Sa pagpapatupad ng pinning, kailangang pumili kung aling cryptographic object ang i-pin. Ang Certificate Pinning ay kumakapit sa X.509 certificate mismo — ang serial number nito, panahon ng bisa, at buong chain. Ang Public Key Pinning ay nagpi-pin lamang ng pampublikong susi sa loob ng sertipiko, hindi pinapansin ang iba pang field. Ang pagpili ay malaki ang epekto sa mga gastos sa operasyon.
| Kriterion | Certificate Pinning | Public Key Pinning |
|---|---|---|
| Object ng pag-pin | X.509 certificate nang buo | RSA/ECDSA pampublikong susi |
| Rotasyon | Nangangailangan ng update sa bawat muling pag-isyu | Hindi nagbabago kapag nagbago ang sertipiko na may parehong susi |
| Seguridad | Pinakapresisong pag-pin | Mas kaunting sensitibo sa mga detalye |
| Flexibility | Mababa — nagbabago ang sertipiko tuwing 1–2 taon | Mataas — ang mga susi ay maaaring tumagal ng 5–10 taon |
| Rekomendasyon | Para sa mga kritikal na system na may kontroladong update | Para sa karamihan ng mobile apps at API |
Public Key Pinning — ang mas gustong pagpili para sa karamihan ng mga proyekto. Ang mga pampublikong susi ng server ay karaniwang nananatiling hindi nagbabago kapag muling inisyu ang sertipiko — nilalagdaan lang ng kumpanya ang lumang susi ng bagong sertipiko. Ibig sabihin nito na ang app ay hindi nangangailangan ng update pagkatapos ng pagbabago ng sertipiko, kung ang key pair ay hindi nagbago. Ang Certificate Pinning ay inirerekomenda para sa mga senaryo kung saan ganap na kinokontrol ng developer ang parehong server at client code, halimbawa, sa corporate apps na may mahigpit na cycle ng update.
TOFU — isang estratehiya kung saan ang Certificate Pinning ay hindi na-configure nang maaga, ngunit naaalala ang sertipiko sa unang koneksyon sa server. Ang approach na ito ay maginhawa para sa mga app na hindi alam nang maaga kung aling server ang kokonektahan. Ang disadvantage — kahinaan sa unang pag-atake: kung ang unang koneksyon ay naharang, ang pekeng sertipiko ay tatanggapin bilang pinagkakatiwalaan. Ang TOFU ay ginagamit sa SSH connections at ilang P2P protocol.
Sa parehong platform, ang Certificate Pinning ay ipinapatupad sa pamamagitan ng pagharang ng TLS connection sa antas ng network stack. Sa iOS, ginagamit ang URLSession delegate o Alamofire ServerTrustManager. Sa Android, ang mas gustong paraan ay OkHttp CertificatePinner, na naka-embed sa mga sikat na HTTP client at sumusuporta sa configuration ng maraming fingerprint para sa bawat domain.
func validate(serverTrust: SecTrust,
pinnedHash: String) -> Bool {
guard let certificates = SecTrustCopyCertificateChain(serverTrust)
as? [SecCertificate] else { return false }
for certificate in certificates {
let data = SecCertificateCopyData(certificate)
var hash = Data(repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
data.withUnsafeBytes {
CC_SHA256($0.baseAddress,
CC_LONG(data.count), &hash)
}
if hash.base64EncodedString() == pinnedHash {
return true
}
}
return false
}
Sa Swift function, mula sa serverTrust ay kinukuha ang chain ng mga sertipiko, para sa bawat isa ay kinakalkula ang SHA-256 hash, at ang resulta ay inihambing sa inaasahan. Ang pagdaan sa lahat ng sertipiko sa chain ay nagbibigay-daan sa pagpapatupad ng pinning sa antas ng intermediate na CA — kung ang intermediate na sertipiko ay tugma, ang koneksyon ay tinatanggap. Ito ay nagbibigay ng flexibility sa rotasyon ng mga leaf certificate.
Kung ang app ay hindi gumagamit ng OkHttp, ang Certificate Pinning ay maaaring ipatupad sa pamamagitan ng custom na X509TrustManager. Ang pamamaraang ito ay nangangailangan ng mas maraming code, ngunit nagbibigay ng ganap na kontrol sa proseso ng pag-verify. Ang TrustManager ay nag-o-override sa checkServerTrusted method, kung saan manu-manong sinusuri ng developer ang mga sertipiko ng server at gumagawa ng desisyon tungkol sa pagtitiwala. Inirerekomenda lamang para sa mga tiyak na senaryo kung saan ang OkHttp library ay hindi available.
Ang pinakakaraniwang pagkakamali — kawalan ng backup pins. Ang developer ay naglalagay ng isang fingerprint ng sertipiko, at sa pag-expire nito, ang mga user ay nawawalan ng koneksyon nang maramihan. Ang minimum na katanggap-tanggap na configuration — dalawang fingerprint: kasalukuyang sertipiko at backup. Optimal — tatlo: kasalukuyan, backup, at fingerprint ng root CA bilang fallback.
Pangalawang pagkakamali — pag-iimbak ng mga pin sa bukas na anyo sa code. Ang isang umaatake na may access sa APK o IPA ay madaling kumuha at magpalit ng mga fingerprint. Inirerekomenda ang obfuscation ng mga hash: hatiin ang string sa mga bahagi, iimbak sa naka-encrypt na resources, o kalkulahin sa pamamagitan ng runtime. Para sa Android, epektibo ang ProGuard na may obfuscation ng string constants.
Pangatlong pagkakamali — pinning sa antas ng development certificate. Ang development at production certificate ay karaniwang magkaiba, ngunit madalas nakakalimutan ng mga developer na palitan ang mga pin kapag nagbu-build ng release. Resulta — ang production app ay hindi makakonekta sa server. Solusyon — hiwalay na configuration ng pin para sa debug at release sa pamamagitan ng BuildConfig o flavour-specific resources.
Mga Madalas Itanong
SSL Pinning — pangkalahatang termino para sa pag-pin sa SSL/TLS certificate. Certificate Pinning — konkretong implementasyon na nagpi-pin ng X.509 certificate mismo, hindi lamang pampublikong susi. Ang pagkakaiba ay nasa object ng pag-pin: certificate vs key.
Inirerekomenda na iimbak ang mga hash sa resources na may obfuscation sa pamamagitan ng ProGuard (Android) o naka-encrypt sa pamamagitan ng Keychain (iOS). Iwasan ang pag-iimbak ng mga pin sa bukas na anyo sa strings.xml o Info.plist nang walang encryption.
Sa bawat pagbabago ng sertipiko sa server. Inirerekomenda na magdagdag ng bagong fingerprint bilang backup pin 3–6 buwan bago mag-expire ang kasalukuyang sertipiko, at pagkatapos ng rotasyon ay tanggalin ang luma. Hindi bababa sa isang backup pin ang sapilitan.
Oo, sa pamamagitan ng conditional compilation: sa debug build, naka-disable ang pinning, sa release — naka-enable. Gamitin ang BuildConfig.DEBUG sa Android o #if DEBUG sa iOS para sa paglipat. Huwag gawin ito sa pamamagitan ng runtime flag na accessible sa user.
Agad na maglabas ng update ng app na may mga bagong fingerprint at i-publish ito sa mga tindahan. Gumamit ng mekanismo ng sapilitang pag-update. Kung ang backup pins ay may kasamang fingerprint ng reserbang CA, pansamantalang maaaring lumipat sa ibang domain na may ibang sertipiko.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din