گزارش آناتومی یک API Treblle در سال ۲۰۲۴ روند نگرانکنندهای را آشکار کرد. با وجود اینکه بیش از ۳۰ سال از وجود آن میگذرد، تنها ۴۵٪ از توسعهدهندگان API از HTTPS برای ارسال یا دریافت دادهها استفاده میکنند. بدتر از آن، این رقم از ۷۴٪ در سال ۲۰۲۳ کاهش یافته است. این تقریباً کاهش ۳۰٪ در یک سال است!
عدم امنیت مناسب دادههای شما مشتریان، شرکت و شهرت شما را در معرض خطر قرار میدهد. ارسال اطلاعات رمزنگارینشده میتواند انواع دادههای حساس را از جمله نامهای کاربری و رمزهای عبور تا دادههای مالی افشا کند. عدم رمزنگاری APIها خطر دادن کلیدهای پادشاهی به مهاجمان سایبری با نامهای کاربری و رمزهای عبور زنده و فعال را به همراه دارد. وقتی از چنین اطلاعات ورود استفاده میکنند، این دسترسی غیرمجاز دشوار است که تشخیص داده شود یا جلوگیری شود.
برای کمک به شما تا اطمینان حاصل کنید که این اتفاق نمیافتد و API شما تا حد ممکن امن است، ما راهنمایی خواهیم کرد که چگونه رمزنگاری SSL/TLS را به APIها اضافه کنید. ما توضیح خواهیم داد که SSL/TLS چیست و نشان خواهیم داد که چگونه میتوان آن را از صفر تنظیم کرد و همچنین به راحتی با استفاده از دروازههای API مدرن فعال کرد.
رمزنگاری SSL/TLS چیست؟
قبل از اینکه به طور جدی بررسی کنیم چگونه رمزنگاری SSL/TLS را به APIها اضافه کنیم، لحظهای را به بررسی اصطلاحات اختصاص دهیم. رمزنگاری SSL/TLS چیست؟ رمزنگاری SSL/TLS به ترتیب مخفف Secure Socket Layer و Transport Layer Security است. هر دو با برقراری یک اتصال امن معروف به handshake کار میکنند. Handshakeها میتوانند با تبادل گواهینامهها، کلیدها یا cipherها اجرا شوند تا اتصال برقرار شود و توافقی در مورد نحوه رمزنگاری و رمزگشایی دادهها ایجاد شود.
چگونه رمزنگاری SSL/TLS را به یک API اضافه کنیم
شروع کار با رمزنگاری SSL/TLS
اولین گام در اضافه کردن رمزنگاری SSL/TLS، به دست آوردن یک گواهی SSL/TLS معتبر در سرور خود از یک مرجع گواهی معتبر (CA) مانند Let’s Encrypt یا Global Sign است. این گواهینامهها اسناد دیجیتال حاوی تمام دادههای لازم برای اعتبارسنجی اصالت یک موجودیت دیجیتال، از جمله نام دامنه، کلید عمومی و صادرکننده گواهی هستند.
توسعهدهندگان API همچنین میتوانند گواهینامههای خودامضا تولید کنند اگر بخواهند. با این حال، بسیاری از مرورگرهای اینترنتی و کلاینتها گواهینامههای خودامضا را نمیشناسند و گاهی حتی هشدارهای امنیتی یا خطاها را فعال میکنند. بنابراین، بهترین شیوهها توصیه میکنند از یک CA رسمی مانند Let’s Encrypt استفاده کنید.
پس از داشتن گواهی SSL/TLS، باید آن را روی سرور API خود نصب کنید. هر سرور روش منحصربهفردی برای نصب دستی گواهی SSL/TLS دارد، بنابراین ممکن است مجبور باشید جزئیات زیرساخت خاص خود را هنگام تنظیم رمزنگاری SSL/TLS روی سرور API تحقیق کنید.
برای اینکه ایده کلی به شما بدهیم، نشان خواهیم داد چگونه یک گواهی SSL/TLS را به یک سرور AWS اضافه کنید. با تولید گواهی با استفاده از یک CA رسمی شروع کنید. ما Let’s Encrypt را به دلیل وضعیت غیرانتفاعی و رایگان بودن سرویس توصیه میکنیم.
برای نصب گواهی SSL روی AWS، گواهی SSL را تولید کنید و سپس آن را دانلود کنید. سپس، وارد کنسول Amazon EC2 شوید. بخش Load Balancers را در منوی ناوبری سمت چپ صفحه پیدا کنید و آن را باز کنید. برای اتصال گواهی SSL/TLS به یک Load Balancer نیاز دارید، بنابراین اگر قبلاً یکی ندارید، باید یکی ایجاد کنید. Listener خود را باز کنید و بخش Listeners را پیدا کنید. اگر Listener موجود را تغییر میدهید، به پایین بروید و پروتکل Load Balancer HTTPS (Secure HTTP) را پیدا کنید و ستون SSL Certificate را پیدا کنید. Change را انتخاب کنید، جایی که میتوانید یک گواهی SSL جدید را به AWS Identity and Access Management (IAM) آپلود کنید.
هنگام ایجاد گواهی، مطمئن شوید نامی به آن بدهید که بعداً به خاطر بسپارید. در فیلد Private Key، متن را از جزء .key گواهی دانلودشده کپی و پیست کنید. همین کار را برای فایل .crt برای Public Key انجام دهید. پس از انجام این کار، به پایین بروید و Listener خود را Save کنید.
اگر Listener را از صفر ایجاد کردهاید، فرصت دارید گواهی SSL/TLS را به عنوان پیشفرض تنظیم کنید. به سادگی بخش Default SSL/TLS Certification را زیر بخش Secure Listener Settings کنسول پیدا کنید. Certificate Source را انتخاب کنید و سپس مراحل بالا را کپی کنید، کلیدهای Private و Public را از گواهی SSL کپی کنید.
این فقط یک مثال است، اما شما باید ایده کلی الگوی اضافه کردن رمزنگاری SSL/TLS به یک سرور را بگیرید. اول، یک گواهی امن بگیرید، سپس آن گواهی را روی سرور خود نصب کنید. این الگو برای توسعهدهندگان API نیز صادق است. به سادگی گواهی SSL/TLS را به سرور API خود اضافه کنید. استفاده از رمزنگاری SSL/TLS برای APIها قوانین و الزامات منحصربهفردی دارد، همانطور که در زیر جزئیات خواهیم داد.
اضافه کردن رمزنگاری SSL/TLS به یک API
حالا، بیایید رمزنگاری SSL/TLS را به یک API اضافه کنیم تا نشان دهیم چگونه کار میکند. بیایید با یک سرور API شروع کنیم. برای این مثال، یک سرور API ساده با استفاده از Flask ایجاد خواهیم کرد، اپلیکیشنی به نام pythonserver با سه endpoint: \users، \resources و \tests.
from flask import Flask, jsonify, request
from werkzeug.middleware.proxy_fix import ProxyFix
# Initialize Flask app
app = Flask(__name__)
# Middleware to handle proxy headers when behind a reverse proxy
app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1, x_host=1)
# Sample data for demonstration purposes
users = [
{"id": 1, "name": "Alice"},
{"id": 2, "name": "Bob"}
]
resources = [
{"id": 1, "type": "ResourceA"},
{"id": 2, "type": "ResourceB"}
]
tests = [
{"id": 1, "status": "Passed"},
{"id": 2, "status": "Failed"}
]
# Define API endpoints
@app.route('/users', methods=['GET'])
def get_users():
return jsonify(users)
@app.route('/resources', methods=['GET'])
def get_resources():
return jsonify(resources)
@app.route('/tests', methods=['GET'])
def get_tests():
return jsonify(tests)
# Run the Flask app on localhost:8080
if __name__ == '__main__':
app.run(debug=True, host='127.0.0.1', port=8080)
حالا، بیایید آن سرور را تنظیم کنیم تا رمزنگاری SSL را الزامی کند. دستور زیر را اجرا کنید تا گواهی SSL خود را برای این آموزش تولید کنید:
openssl req -newkey rsa:2048 -nodes -keyout server.key -x509 -out server.crt
به شما انواع پرامپتها برای پر کردن داده میشود تا گواهی تولید شود. پس از اتمام، دو فایل در دایرکتوری برنامهنویسی خود خواهید داشت: server.crt و server.key.
حالا سرور Flask خود را تغییر دهیم تا رمزنگاری SSL را انتظار داشته باشد:
from flask import Flask, jsonify, request
from werkzeug.middleware.proxy_fix import ProxyFix
# Initialize Flask app
app = Flask(__name__)
# Middleware to handle proxy headers when behind a reverse proxy
app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1, x_host=1)
# Sample data for demonstration purposes
users = [
{"id": 1, "name": "Alice"},
{"id": 2, "name": "Bob"}
]
resources = [
{"id": 1, "type": "ResourceA"},
{"id": 2, "type": "ResourceB"}
]
tests = [
{"id": 1, "status": "Passed"},
{"id": 2, "status": "Failed"}
]
# Define API endpoints
@app.route('/users', methods=['GET'])
def get_users():
return jsonify(users)
@app.route('/resources', methods=['GET'])
def get_resources():
return jsonify(resources)
@app.route('/tests', methods=['GET'])
def get_tests():
return jsonify(tests)
# Run the Flask app with SSL encryption
if __name__ == '__main__':
app.run(debug=True, host='127.0.0.1', port=8080, ssl_context=('server.crt', 'server.key'))
اگر این اسکریپت را همانطور اجرا کنید، باید خطای Privacy در مرورگر ببینید. این فقط به دلیل استفاده از گواهی خودامضا است که مرورگر به طور پیشفرض به آن اعتماد ندارد. این نباید در هنگام استفاده از گواهی SSL صادرشده توسط CA رسمی رخ دهد.
از آنجایی که فقط روی سرور تولید تست میکنید، اجازه دهید مرورگر به سایت اعتماد کند. یکی از endpointهای خود را باز کنید و باید دادههای تست از اسکریپت Python را ببینید. اگر فایلهای گواهی و کلید وجود نداشته باشند، چیزی نخواهید دید، زیرا اسکریپت حتی اجرا نمیشود. همین اتفاق اگر فایلهای .crt یا .key تولیدشده با SSL به هر شکلی تغییر کنند، رخ میدهد.
اجبار رمزنگاری SSL/TLS
پس از اینکه سرور API شما برای ارسال و دریافت رمزنگاری SSL/TLS تنظیم شد، باید اطمینان حاصل کنید که کاربران شما از آن استفاده میکنند. این نیاز به HTTPS برای تمام تراکنشهای شما دارد، شکل امن HTTP که از رمزنگاری SSL/TLS استفاده میکند. این میتواند به روشهای مختلفی انجام شود. هدایت درخواستهای HTTP پایه به HTTPS با استفاده از هدرهای HTTP Strict Transport Security (HSTS) تکنیک محبوبی است. همچنین کتابخانهها و فریمورکهای مختلف SSL/TSL، مانند ماژول https برای Node.js.
همانطور که میبینید، رمزنگاری SSL/TLS مانند اکثر جریانهای مجوز دیگر کار میکند، جفت کردن یک کلید عمومی و یک کلید خصوصی. البته، روش محلی که برای ایجاد گواهی SSL خصوصی استفاده کردیم کاربردهای عملی محدودی دارد، اما برای نشان دادن اصول مفید است.
حالا بیایید نگاهی به نحوه ایجاد سرور API با استفاده از دروازه API بیندازیم، زیرا بسیاری از ابزارهای مدیریت API راهحلهای بومی برای اجبار رمزنگاری SSL/TSL ارائه میدهند.
اضافه کردن رمزنگاری SSL/TLS به سرور API شما
بیایید با ایجاد سریع یک سرور API جدید با استفاده از دروازه API به پایان برسانیم تا ببینید چگونه رمزنگاری SSL/TSL وابسته به پلتفرم خاصی نیست. برای شروع، از Certbot برای تولید گواهی مجاز از Let’s Encrypt استفاده خواهیم کرد. اگر قبلاً نصب نکردهاید، Certbot را نصب کنید. پس از راهاندازی، به پوشه توسعه پروژه خود بروید. دستور زیر را در ترمینال به عنوان Administrator اجرا کنید:
certbot certonly --manual --preferred-challenges dns
شما از طریق سری پرامپتها هدایت خواهید شد، در پایان به شما نامی و مقداری داده میشود تا به تنظیمات DNS سرور خود اضافه کنید. یک رکورد جدید با نام ارائهشده ایجاد کنید، با نوع TXT، و مقدار ارائهشده را به عنوان داده وارد کنید. پس از ایجاد این رکورد، باید سرور وب خود را تنظیم کنید تا HTTPS را اجبار کند. برای این کار، باید ترافیک HTTP را به HTTPS هدایت کنید. همچنین باید فقط روی پورت ۴۴۳ گوش دهد، که HTTPS را مدیریت میکند. اگر سرور NGINX اجرا میکنید، چیزی شبیه این خواهد بود:
server {
listen 80;
server_name api.example.com;
return 301 https://$host$request_uri; # Redirect HTTP to HTTPS
}
server {
listen 443 ssl;
server_name api.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:5000; # Example API backend
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
پس از تغییر، میتوانید تنظیمات را با اجرای دستور زیر تست کنید:
sudo nginx -tپس از تکمیل همه اینها، سرور خود را ریاستارت کنید.
sudo systemctl reload nginxپس از بهروزرسانی سرور وب، باید API خود را نیز تغییر دهید تا HTTPS را اجبار کند. برای سرور Flask، با نصب Flask-Talisman شروع کنید. سپس اسکریپت سرور API موجود خود را با اضافه کردن موارد زیر تغییر دهید:
from flask import Flask
from flask_talisman import Talisman
app = Flask(__name__)
Talisman(app)
@app.route("/")
def home():
return "Secure API Server"
if __name__ == "__main__":
app.run(ssl_context=("fullchain.pem", "privkey.pem"))
همچنین باید هر بلوک listen 80 روی NGINX یا virtual hostهای HTTP روی Apache را حذف کنید. پس از تغییر همه اینها، میتوانید API خود را تست کنید تا اطمینان حاصل کنید فقط درخواستهای HTTPS را میپذیرد.
curl -k -X GET https://api.thisexample.com/resource
افکار نهایی در مورد رمزنگاری SSL/TLS
با اینکه دادههای حساس بیشتری روی اینترنت قرار میگیرد، توسعهدهندگان و کاربران باید پروتکلهای جدید ارسال و دریافت رمزنگاری را درک کنند. ما به شما نشان دادیم چگونه رمزنگاری SSL/TLS را به APIهای خود به روش سخت اضافه کنید تا اصول را بهتر درک کنید، و امکان اضافه کردن رمزنگاری SSL/TSL به سرور API خود را بدون توجه به فناوری که استفاده میکنید، فراهم کنید.
با این حال، اضافه کردن رمزنگاری SSL/TSL به APIها با استفاده از ابزاری مانند دروازه API معمولاً به سادگی کلیک یک دکمه است، زیرا اکثر پلتفرمهای مدیریت API مدرن و دروازهها پشتیبانی بومی برای ارسال و دریافت دادههای رمزنگاریشده ارائه میدهند. فقط به دنبال گزینهای مانند Enable SSL/TSL Encryption یا Require HTTPS یا چیزی شبیه به آن باشید.
