به سمت اتوماسیون صدور SSL

اغلب ما مجبوریم با گواهینامه های SSL کار کنیم. بیایید روند ایجاد و نصب گواهی را به یاد بیاوریم (در حالت کلی برای بیشتر).

  • یک ارائه دهنده (سایتی که در آن می توانیم SSL بخریم) پیدا کنید.
  • CSR ایجاد کنید.
  • آن را برای ارائه دهنده خود ارسال کنید.
  • تایید مالکیت دامنه
  • گواهینامه بگیرید.
  • گواهی را به فرم مورد نیاز (اختیاری) تبدیل کنید. به عنوان مثال، از pem به PKCS #12.
  • گواهی را روی وب سرور نصب کنید.

نسبتا سریع، پیچیده و قابل درک نیست. اگر حداکثر ده پروژه داشته باشیم این گزینه کاملا مناسب است. اگر تعداد آنها بیشتر باشد و حداقل سه محیط داشته باشند چه؟ توسعه دهنده کلاسیک - صحنه سازی - تولید. در این مورد، ارزش آن را دارد که در مورد خودکار کردن این فرآیند فکر کنید. من پیشنهاد می‌کنم کمی عمیق‌تر به مشکل بپردازیم و راه‌حلی بیابیم که زمان صرف شده برای ایجاد و نگهداری گواهی‌ها را به حداقل برساند. مقاله حاوی تجزیه و تحلیل مشکل و راهنمای کوچکی برای تکرار خواهد بود.

اجازه دهید از قبل رزرو کنم: تخصص اصلی شرکت ما .net و بر این اساس IIS و سایر محصولات مرتبط با ویندوز است. بنابراین کلاینت ACME و تمامی اقدامات مربوط به آن نیز از نقطه نظر استفاده از ویندوز شرح داده خواهد شد.

این برای چه کسانی مرتبط است و برخی از داده های اولیه

شرکت K به نمایندگی از نویسنده. URL (به عنوان مثال): company.tld

پروژه X یکی از پروژه های ما است که در حین کار روی آن به این نتیجه رسیدم که هنوز باید به سمت حداکثر صرفه جویی در زمان در هنگام کار با گواهی ها حرکت کنیم. این پروژه دارای چهار محیط توسعه، تست، استیجینگ و تولید است. Dev و test در کنار ما هستند، صحنه سازی و تولید در سمت مشتری است.

ویژگی خاص پروژه این است که تعداد زیادی ماژول دارد که به عنوان زیر دامنه در دسترس هستند.

یعنی تصویر زیر را داریم:

برنامه نویس
تست
چوب بست
تولید

projectX.dev.company.tld
projectX.test.company.tld
staging.projectX.tld
projectX.tld

module1.projectX.dev.company.tld
module1.projectX.test.company.tld
module1.staging.projectX.tld
module1.projectX.tld

module2.projectX.dev.company.tld
module2.projectX.test.company.tld
module2.staging.projectX.tld
module2.projectX.tld

...
...
...
...

moduleN.projectX.dev.company.tld
moduleN.projectX.test.company.tld
moduleN.staging.projectX.tld
moduleN.projectX.tld

برای تولید، از گواهی نامه عام خریداری شده استفاده می شود، در اینجا هیچ سوالی پیش نمی آید. اما فقط سطح اول ساب دامنه را پوشش می دهد. بر این اساس، اگر گواهی برای *.projectX.tld وجود داشته باشد، برای staging.projectX.tld کار خواهد کرد، اما برای module1.staging.projectX.tld کار نخواهد کرد. اما به نوعی من نمی خواهم جداگانه بخرم.

و این فقط بر اساس مثال یک پروژه از یک شرکت است. و البته بیش از یک پروژه وجود دارد.

دلایل رایج برای همه برای پرداختن به این موضوع چیزی شبیه به این است:

  • به تازگی گوگل پیشنهاد کاهش حداکثر مدت اعتبار گواهینامه های SSL را داده است. با همه عواقبش
  • تسهیل فرآیند صدور و نگهداری SSL برای نیازهای داخلی پروژه ها و کل شرکت.
  • ذخیره سازی متمرکز سوابق گواهی که تا حدی مشکل تأیید دامنه با استفاده از DNS و متعاقب آن تمدید خودکار را حل می کند و همچنین مشکل اعتماد مشتری را حل می کند. با این حال، یک CNAME روی سرور یک شرکت شریک/ مجری قابل اعتمادتر از یک منبع شخص ثالث است.
  • خوب، در نهایت، در این مورد عبارت "بهتر است داشتن از نداشتن" کاملاً مطابقت دارد.

انتخاب یک ارائه دهنده SSL و مراحل آماده سازی

در میان گزینه های موجود برای گواهینامه های رایگان SSL، cloudflare و letsencrypt در نظر گرفته شد. DNS برای این (و برخی پروژه های دیگر) توسط cloudflare میزبانی می شود، اما من طرفدار استفاده از گواهینامه های آنها نیستم. بنابراین تصمیم گرفته شد از letsencrypt استفاده شود.
برای ایجاد یک گواهی SSL با حروف عام، باید مالکیت دامنه را تأیید کنید. این روش شامل ایجاد مقداری رکورد DNS (TXT یا CNAME) و سپس تأیید آن هنگام صدور گواهی است. لینوکس یک ابزار کاربردی دارد - certbot، که به شما امکان می دهد تا حدی (یا به طور کامل برای برخی از ارائه دهندگان DNS) این فرآیند را خودکار کنید. برای ویندوز از یافت و تأیید شد گزینه های کلاینت ACME که من روی آنها حل و فصل کردم WinACME.

و رکورد دامنه ایجاد شده است، بیایید به ایجاد یک گواهی ادامه دهیم:

به سمت اتوماسیون صدور SSL

ما به آخرین نتیجه گیری علاقه مند هستیم، یعنی گزینه های موجود برای تأیید مالکیت دامنه برای صدور گواهی نامه عام:

  1. ایجاد رکوردهای DNS به صورت دستی (به روز رسانی خودکار پشتیبانی نمی شود)
  2. ایجاد رکوردهای DNS با استفاده از سرور acme-dns (می توانید در مورد آن بیشتر بخوانید اینجا.
  3. ایجاد رکوردهای DNS با استفاده از اسکریپت خود (شبیه به پلاگین cloudflare برای certbot).

در نگاه اول، نکته سوم کاملا مناسب است، اما اگر ارائه دهنده DNS از این قابلیت پشتیبانی نکند، چه؟ اما ما به یک مورد کلی نیاز داریم. اما مورد کلی رکوردهای CNAME است، زیرا همه آنها را پشتیبانی می کنند. بنابراین، در نقطه 2 توقف کرده و به پیکربندی سرور ACME-DNS خود می رویم.

راه اندازی سرور ACME-DNS و فرآیند صدور گواهی

به عنوان مثال، من دامنه 2nd.pp.ua را ایجاد کردم و در آینده از آن استفاده خواهم کرد.

نیاز اجباری برای اینکه سرور به درستی کار کند، لازم است رکوردهای NS و A برای دامنه آن ایجاد شود. و اولین لحظه ناخوشایندی که با آن مواجه شدم این است که cloudflare (حداقل در حالت استفاده رایگان) به شما اجازه نمی دهد که به طور همزمان یک رکورد NS و A برای یک میزبان ایجاد کنید. نه اینکه این یک مشکل باشد، اما در bind ممکن است. پشتیبانی پاسخ داد که پنل آنها اجازه انجام این کار را نمی دهد. مشکلی نیست، بیایید دو رکورد ایجاد کنیم:

acmens.2nd.pp.ua. IN A 35.237.128.147
acme.2nd.pp.ua. IN NS acmens.2nd.pp.ua.

در این مرحله هاست ما باید حل کند acmens.2nd.pp.ua.

$ ping acmens.2nd.pp.ua
PING acmens.2nd.pp.ua (35.237.128.147) 56(84) bytes of data

و در اینجا acme.2nd.pp.ua حل نمی شود، زیرا سرور DNS که به آن سرویس می دهد هنوز در حال اجرا نیست.

رکوردها ایجاد شده اند، ما به راه اندازی و راه اندازی سرور ACME-DNS ادامه می دهیم. در سرور اوبونتو من زندگی خواهد کرد داکتر ظرف، اما شما می توانید آن را در هر جایی که گلانگ در دسترس است اجرا کنید. ویندوز نیز کاملا مناسب است، اما من هنوز سرور لینوکس را ترجیح می دهم.

دایرکتوری ها و فایل های لازم را ایجاد کنید:

$ mkdir config
$ mkdir data
$ touch config/config.cfg

بیایید از vim با ویرایشگر متن مورد علاقه خود استفاده کنیم و نمونه را در config.cfg قرار دهیم پیکربندی.

برای عملکرد موفقیت آمیز، کافی است بخش های عمومی و api را اصلاح کنید:

[general]
listen = "0.0.0.0:53"
protocol = "both"
domain = "acme.2nd.pp.ua"
nsname = "acmens.2nd.pp.ua" 
nsadmin = "admin.2nd.pp.ua" 
records = 
    "acme.2nd.pp.ua. A 35.237.128.147",
    "acme.2nd.pp.ua. NS acmens.2nd.pp.ua.",                                                                                                                                                                                                  ]
...
[api]
...
tls = "letsencrypt"
…

همچنین، در صورت تمایل، یک فایل docker-compose در دایرکتوری اصلی سرویس ایجاد خواهیم کرد:

version: '3.7'
services:
  acmedns:
    image: joohoi/acme-dns:latest
    ports:
      - "443:443"
      - "53:53"
      - "53:53/udp"
      - "80:80"
    volumes:
      - ./config:/etc/acme-dns:ro
      - ./data:/var/lib/acme-dns

آماده. می توانید آن را اجرا کنید.

$ docker-compose up -d

در این مرحله میزبان باید شروع به حل کند acme.2nd.pp.ua، و یک 404 ظاهر می شود https://acme.2nd.pp.ua

$ ping acme.2nd.pp.ua
PING acme.2nd.pp.ua (35.237.128.147) 56(84) bytes of data.

$ curl https://acme.2nd.pp.ua
404 page not found

اگر این ظاهر نشد - docker logs -f <container_name> برای کمک، خوشبختانه، سیاهههای مربوط کاملا خوانا هستند.

ما می توانیم شروع به ایجاد گواهی کنیم. powershell را به عنوان مدیر باز کنید و winacme را اجرا کنید. ما به انتخابات علاقه مندیم:

  • M: ایجاد گواهی جدید (گزینه های کامل)
  • 2: ورودی دستی
  • 2: [dns-01] سوابق تایید را با acme-dns ایجاد کنید (https://github.com/joohoi/acme-dns)
  • هنگامی که در مورد پیوند به سرور ACME-DNS سؤال می شود، آدرس سرور ایجاد شده (https) را در پاسخ وارد کنید. آدرس سرور acme-dns: https://acme.2nd.pp.ua

در افتتاحیه، مشتری رکوردی را صادر می کند که باید به سرور DNS موجود اضافه شود (روش یکبار مصرف):

[INFO] Creating new acme-dns registration for domain 1nd.pp.ua

Domain:              1nd.pp.ua
Record:               _acme-challenge.1nd.pp.ua
Type:                   CNAME
Content:              c82a88a5-499f-464f-96e4-be7f606a3b47.acme.2nd.pp.ua.
Note:                   Some DNS control panels add the final dot automatically.
                           Only one is required.

به سمت اتوماسیون صدور SSL

ما رکورد لازم را ایجاد می کنیم و مطمئن می شویم که به درستی ایجاد شده است:

به سمت اتوماسیون صدور SSL

$ dig CNAME _acme-challenge.1nd.pp.ua +short
c82a88a5-499f-464f-96e4-be7f606a3b47.acme.2nd.pp.ua.

ما تأیید می کنیم که ورودی مورد نیاز را در winacme ایجاد کرده ایم و روند ایجاد گواهی را ادامه می دهیم:

به سمت اتوماسیون صدور SSL

نحوه استفاده از certbot به عنوان مشتری توضیح داده شده است اینجا.

این فرآیند ایجاد گواهی را تکمیل می کند؛ می توانید آن را روی وب سرور نصب کرده و از آن استفاده کنید. اگر هنگام ایجاد گواهی، وظیفه ای را نیز در زمانبندی ایجاد کنید، در آینده فرآیند تمدید گواهی به طور خودکار انجام می شود.

منبع: www.habr.com

اضافه کردن نظر