SSL/TLS — پروتکلهای رمزنگاری هستند که دادههای بین برنامه موبایل و سرور را رمزگذاری کرده و محرمانگی و یکپارچگی ترافیک را تضمین میکنند. به گفته Apple (2026)، App Transport Security به طور پیشفرض اتصالات پایینتر از TLS 1.2 را در تمام دستگاههای iOS مسدود میکند. TLS 1.3 زمان دستدهی را در مقایسه با TLS 1.2 به نصف کاهش میدهد و UX برنامههای موبایل را بهبود میبخشد.
نکات اصلی
SSL (Secure Sockets Layer) و TLS (Transport Layer Security) — پروتکلهای رمزنگاری هستند که انتقال امن دادهها از طریق شبکه را تضمین میکنند. SSL که توسط Netscape در دهه 1990 توسعه یافت، پس از نسخه 3.0 به دلیل آسیبپذیریهای POODLE و BEAST منسوخ اعلام شد. TLS، جانشین آن، از نسخههای 1.0، 1.1، 1.2 و 1.3 عبور کرده است — در حال حاضر فقط TLS 1.2 و TLS 1.3 بهروز محسوب میشوند. همه پلتفرمهای موبایل مدرن استفاده از TLS را برای اتصالات شبکه الزامی میکنند و App Store و Google Play این موضوع را در مرحله بررسی تأیید میکنند.
بدون TLS، ترافیک بین برنامه و سرور به صورت متن ساده منتقل میشود — هر کسی در همان شبکه Wi-Fi میتواند با استفاده از Wireshark یا tcpdump نامهای کاربری، رمزهای عبور، توکنها و دادههای شخصی کاربران را رهگیری کند. TLS تمام دادههای منتقل شده را رمزگذاری میکند (رمزنگاری در سطح حملونقل) و اصالت سرور را از طریق زنجیره گواهیهای X.509 تأیید میکند. به گفته IETF (2018)، TLS 1.3 فقط از رمزنگارهای مدرن AEAD (AES-GCM، ChaCha20-Poly1305) استفاده میکند و الگوریتمهای منسوخ مانند RC4 و 3DES را حذف میکند.
HTTPS (HTTP Secure) — HTTP از طریق TLS است. وقتی برنامه موبایل درخواستی را از طریق https:// ارسال میکند، ابتدا یک اتصال TLS با سرور برقرار میکند و سپس هدرهای HTTP و بدنه درخواست را از طریق کانال رمزگذاری شده منتقل میکند. بدون HTTPS هیچ API جدی نباید کار کند — این بهداشت پایه امنیتی است. به گفته OWASP (2026)، اتصالات ناامن در بین 3 آسیبپذیری برتر برنامههای موبایل قرار دارند.
TLS Handshake — فرآیند برقراری اتصال امن بین کلاینت و سرور است. طرفین نسخه پروتکل را توافق میکنند، مجموعه رمزنگار (cipher suite) را انتخاب میکنند، کلیدها را از طریق رمزنگاری نامتقارن مبادله میکنند و گواهیها را تأیید میکنند. در TLS 1.2 دستدهی به 2 Round Trip Time (2 RTT) نیاز دارد: کلاینت → سرور با ClientHello، سرور → کلاینت با ServerHello و Certificate، سپس پیامهای نهایی Finished. TLS 1.3 این فرآیند را به 1 RTT کاهش میدهد.
مرحله اول: ClientHello — کلاینت نسخههای TLS پشتیبانی شده، لیست مجموعه رمزنگارها و یک عدد تصادفی را ارسال میکند. سرور با ServerHello پاسخ میدهد، نسخه و مجموعه رمزنگار را انتخاب میکند، گواهی X.509 خود (Certificate) و پیام ServerHelloDone را ارسال میکند. کلاینت گواهی را از طریق زنجیره مراکز صدور گواهی معتبر (CA) تأیید میکند، pre-master secret تولید میکند، آن را با کلید عمومی موجود در گواهی رمزگذاری میکند و در ClientKeyExchange به سرور ارسال میکند. پس از آن، هر دو طرف کلیدهای جلسه را تولید کرده و پیامهای ChangeCipherSpec و Finished را مبادله میکنند. از این لحظه به بعد، تمام دادهها به صورت متقارن رمزگذاری میشوند.
import Security
let url = URL(string: "https://api.example.com")!
let session = URLSession(configuration: .default,
delegate: self,
delegateQueue: nil)
func urlSession(
_ session: URLSession,
didReceive challenge: URLAuthenticationChallenge,
completionHandler: @escaping (URLSession.AuthChallengeDisposition,
URLCredential?) -> Void
) {
let trust = challenge.protectionSpace.serverTrust
guard let trust else {
completionHandler(.cancelAuthenticationChallenge, nil)
return
}
completionHandler(.useCredential, URLCredential(trust: trust))
}
نمونه پردازش URLAuthenticationChallenge در iOS از طریق URLSessionDelegate. این متد در هر TLS Handshake فراخوانی میشود و به برنامه اجازه میدهد گواهی سرور را به صورت سفارشی بررسی کند. برای استفاده تولید، بررسی گواهی را از طریق SecTrustEvaluateWithError اضافه کنید و با اثر انگشت از پیش ذخیره شده مقایسه کنید — فقط پس از آن useCredential را فراخوانی کنید.
TLS 1.3 (RFC 8446، 2018) — اولین بهروزرسانی بزرگ پروتکل در 10 سال گذشته است. بهبودهای اصلی: دستدهی به 1 RTT کاهش یافته (0 RTT برای اتصالات مجدد)، مجموعه رمزنگارهای منسوخ (RSA key exchange، CBC-mode) حذف شده، رمزنگاری پیشرو اجباری (PFS) و محافظت در برابر حملات downgrade از طریق signed transcript. به گفته Qualys SSL Labs (2026)، TLS 1.3 به لطف PFS حتی در صورت به خطر افتادن کلید بلندمدت سرور نیز محافظت را تضمین میکند.
| ویژگی | TLS 1.2 | TLS 1.3 |
|---|---|---|
| Handshake | 2 RTT (کامل) | 1 RTT (0 RTT با PSK) |
| مجموعه رمزنگارها | 30+ ترکیب (RSA، DH، ECDH) | 5 مجموعه AEAD (AES-GCM، ChaCha20) |
| Forward Secrecy | اختیاری (DHE، ECDHE) | اجباری (همه مجموعهها) |
| پشتیبانی iOS | iOS 5+ | iOS 12+ |
| پشتیبانی Android | Android 4.0+ | Android 10+ |
| الگوریتمهای منسوخ | RSA، CBC، RC4، 3DES | کاملاً حذف شده |
0-RTT (Zero Round Trip Time) — ویژگی TLS 1.3 که به کلاینت اجازه میدهد در اتصالات مجدد از طریق PSK (Pre-Shared Key) بلافاصله همراه با ClientHello داده ارسال کند. این کار بارگذاری صفحات بعدی در برنامههای موبایل را تسریع میکند، به ویژه هنگام درخواستهای مکرر به یک سرور. با این حال، دادههای 0-RTT در برابر حملات replay محافظت نمیشوند — میتوان آنها را رهگیری و مجدداً ارسال کرد. از 0-RTT فقط برای درخواستهای ایدمپوتنت (GET، PUT) بدون عوارض جانبی استفاده کنید.
App Transport Security (ATS) — مکانیزم اپل که اتصالات HTTPS با TLS 1.2 یا بالاتر را الزامی میکند و از iOS 9 به طور پیشفرض فعال است. ATS تمام اتصالات HTTP و HTTPS با TLS پایینتر از 1.2 را مسدود میکند. توسعهدهنده میتواند استثناهایی را در Info.plist از طریق NSAppTransportSecurity برای دامنههای خاص پیکربندی کند، اما اپل توصیه میکند استثناها را به حداقل برسانید و در همه جا از HTTPS استفاده کنید. نقض الزامات ATS دلیلی برای رد برنامه در بررسی App Store است.
<!-- Info.plist — App Transport Security -->
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
<key>NSExceptionDomains</key>
<dict>
<key>cdn.example.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<false/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
</dict>
</dict>
<key>NSAllowsLocalNetworking</key>
<true/>
</dict>
پیکربندی ATS در Info.plist. NSAllowsArbitraryLoads روی false تنظیم شده — همه اتصالات باید از HTTPS استفاده کنند. برای دامنه cdn.example.com حداقل نسخه TLS 1.2 تنظیم شده، NSAllowsLocalNetworking=true به HTTP برای شبکه محلی اجازه میدهد (برای سرورهای توسعه مفید است). اپل اکیداً توصیه میکند NSAllowsArbitraryLoads را بدون NSExceptionDomains فعال نکنید — این باید یک استثنا باشد، نه یک قانون کلی.
Network Security Config — مکانیزم اندروید برای پیکربندی HTTPS و TLS بدون تغییر کد Java/Kotlin. پیکربندی در فایل XML network_security_config.xml تعریف میشود و در AndroidManifest از طریق ویژگی android:networkSecurityConfig متصل میشود. از پیکربندی گواهیهای معتبر (user و system CA)، Certificate Pinning، غیرفعال کردن HTTP متن ساده، بازنویسیهای debug و هدایت ترافیک پشتیبانی میکند.
<!-- res/xml/network_security_config.xml -->
<network-security-config>
<base-config cleartextTrafficPermitted="false">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">api.example.com</domain>
<pin-set expiration="2027-01-01">
<pin digest="SHA-256">
47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=
</pin>
</pin-set>
</domain-config>
</network-security-config>
Network Security Config برای اندروید. Base-config ترافیک متن ساده را ممنوع میکند و فقط به گواهیهای سیستم CA اعتماد میکند (بدون گواهی کاربر — محافظت در برابر نصب گواهیهای MitM توسط کاربر). Domain-config برای api.example.com شامل pin-set با اثر انگشت SHA-256 گواهی است. اگر گواهی سرور قبل از تاریخ انقضای مشخص شده تغییر کند، اتصال رد میشود — این شکل سختگیرانه Certificate Pinning است.
Certificate Pinning — تکنیک تثبیت گواهی یا کلید عمومی سرور در کد برنامه است. در هر TLS Handshake، کلاینت گواهی سرور را با اثر انگشت از پیش ذخیره شده (هش SHA-256) مقایسه میکند. حتی اگر مهاجم یک گواهی CA معتبر به دست آورد یا مرکز صدور گواهی را به خطر بیندازد، نمیتواند حمله MitM انجام دهد — برنامه اثر انگشت خاص را بررسی میکند، نه زنجیره CA. این به ویژه برای برنامههای مالی و برنامههای دارای دادههای حساس مهم است.
Certificate Pinning نیاز به احتیاط دارد: هنگام تغییر گواهی روی سرور، تمام نسخههای قدیمی برنامه قادر به اتصال نخواهند بود. توصیه میشود چند اثر انگشت ذخیره (اصلی + پشتیبان) نگهداری کنید، تاریخ انقضای pin-set را مشخص کنید و یک مکانیزم fallback از طریق تأیید استاندارد CA پیادهسازی کنید. جایگزین — Trust On First Use (TOFU)، زمانی که برنامه گواهی را در اولین اتصال ذخیره میکند و در صورت تغییر آن به کاربر هشدار میدهد. به گفته OWASP (2026)، فقدان Certificate Pinning در بین 3 آسیبپذیری برتر برنامههای موبایل (M3: Insecure Communication) قرار دارد.
در Alamofire 5+، Certificate Pinning از طریق ServerTrustManager با PinnedCertificatesTrustEvaluator (بررسی کل گواهی) یا PublicKeysTrustEvaluator (فقط کلید عمومی) پیکربندی میشود. کلید عمومی ترجیح داده میشود — با بهروزرسانی گواهی در همان CA تغییر نمیکند. یک ServerTrustManager با دیکشنری [host: evaluator] ایجاد کنید، آن را به Session منتقل کنید و برای همه درخواستها به APIهای محافظت شده استفاده کنید.
سوالات متداول
SSL — پروتکل منسوخ (نسخههای 2.0 و 3.0) که به دلیل آسیبپذیریهای POODLE و BEAST ناامن اعلام شده است. TLS — جانشین آن، از TLS 1.0 (RFC 2246، 1999). هر “گواهی SSL” مدرن یک گواهی X.509 است که توسط پروتکل TLS استفاده میشود. SSL 3.0 در تمام سیستمعاملها و مرورگرهای مدرن ممنوع است.
App Transport Security — الزام اپل برای امنیت برنامهها. HTTP دادهها را به صورت متن ساده منتقل میکند و امکان رهگیری توکنها و دادههای شخصی کاربران در شبکههای Wi-Fi عمومی را فراهم میکند. ATS به طور پیشفرض HTTP و HTTPS با TLS پایینتر از 1.2 را مسدود میکند و حتی بدون اقدام توسعهدهنده از کاربران محافظت میکند.
از SSL Labs (ssllabs.com/ssltest) یا خط فرمان استفاده کنید: openssl s_client -tls1_3 -connect example.com:443. در اکثر پلتفرمهای ابری (AWS CloudFront، Cloudflare، Nginx 1.19+، Caddy) TLS 1.3 به طور پیشفرض فعال است. در Android 10+ پشتیبانی در ارائهدهنده سیستم Conscrypt تعبیه شده است.
Self-Signed Certificate — گواهیای که توسط خود شخص امضا شده است، نه توسط مرکز صدور گواهی. در تولید نمیتوان از آن استفاده کرد — سیستمعاملهای موبایل به چنین گواهی اعتماد نمیکنند. برای توسعه محلی استفاده میشود: گواهی را از طریق MDM به گواهیهای معتمد اضافه کنید یا از بیلدهای debug با بررسی غیرفعال استفاده کنید.
یک ServerTrustManager با PinnedCertificatesTrustEvaluator یا PublicKeysTrustEvaluator ایجاد کنید. اولی کل گواهی را بررسی میکند، دومی فقط کلید عمومی (ترجیح داده میشود). مدیر را به Session(configuration: serverTrustManager:) منتقل کنید و از session برای تمام درخواستها به API استفاده کنید.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید