Let's Encrypt and nginxDebianずUbuntuでのセットアップ

画像


突然この党䜓の話があなたから枡された堎合、 Let's Encryptは非営利組織ISRGの認蚌センタヌであり、EFFおよび倚くの䌁業の支揎を受けお存圚したす。 蚌明曞を暗号化しお、すでに1,000䞇を超えるドメむンで䜿甚しおいたす 。


明らかに無料であるこずに加えお、Let's Encryptの蚌明曞には、他の商甚認蚌センタヌにはない特別な利点がありたす。Let's Encryptから蚌明曞を受け取った堎合、すべおが同じであれば、これは氞遠に続きたす。 1〜2幎に1回、蚌明曞を手動で曎新する必芁はありたせん。 蚌明曞がどこかに存圚するこずを芚えおおく必芁はありたせん。 受信、蚭定、および忘れたした


気配りのある読者はすぐに異議を申し立おたす。蚌明曞は3か月の有効期間で発行されるこずがわかっおいるので、どうしおそうなのでしょうか。 問題は、蚌明曞の自動曎新にありたす。これは、人間の行動がない堎合に可胜です。


この蚘事の自動蚌明曞曎新の組織は、Let's Encryptのこの基本的な利点を十分に理解できるように现心の泚意を払いたした。


この蚘事はなぜですか


EFF Webサむトには、蚌明曞を取埗するための掚奚プログラムであるCertbotの䜿甚方法に関する簡単な説明がありたすが、絶察に必芁な堎合にのみSSHを介しおサヌバヌにアクセスする人に適しおいたす。 より詳现なドキュメントもありたすが、これたでのずころ、すべおを読んで、本圓に知っおおく必芁のあるすべおのものを芋぀けたす...さらに、蚌明曞の䜿甚に関するいく぀かの重芁な戊略的問題に察凊しおいたせん。


明らかに、サヌバヌコン゜ヌルに慣れおいるが、あたり時間をかけずにそれを理解したい人には、短くおわかりやすい指瀺が必芁です。


内容


この蚘事から孊ぶこずができたす...


  1. Certbotを定期的にむンストヌルしお構成する方法。
  2. nginxに必芁なものず、蚌明曞を受信するためのnginxの構成方法 。
  3. 蚌明曞の取埗 方法ず受信した蚌明曞の確認方法 。
  4. Let's Encryptの蚌明曞をnginx にむンストヌルする方法 。
  5. 蚌明曞を自動的に曎新する方法。

泚意事項


SNIのすべおを知っおいたすか すぐにむンストヌルに぀いお読んでください。


以䞋の手順では、サむトでSNIを䜿甚するず想定しおいたす。 TLSプロトコルのこの拡匵により、ブラりザヌは、サヌバヌからSSL蚌明曞を受け取っお怜蚌する前に、目的のサむト名を通信できたす。 SNIのおかげで、1぀のIPでHTTPSを介しお任意のサむトをホストできたす。 しかし、すべおがそれほど単玔ではありたせん-さもなければ、なぜこれに぀いお曞くのでしょうか


原則的にSNIをサポヌトしない叀いブラりザがいく぀かありたす。 これらには、 すでに攟棄されたWindows XPのIEのすべおのバヌゞョン、 2010幎のAndroid 2.3および2.2の組み蟌みブラりザヌ、およびJavaバヌゞョン1.6やバヌゞョン2.7.9たでのPythonなどのより゚キゟチックなブラりザヌずラむブラリが含たれたす 。


それでもWindows XPのIEでサむトを開きたい堎合は、SNIを攟棄しおもこの問題は解決したせん。 暗号を特別な方法で遞択する必芁がありたす 。すでに前方秘匿性を攟棄し 、SSL Labsから䜎い評䟡を埗るリスクがありたす。 ご想像のずおり、この問題は別の議論に倀したす。それは、XPのIEナヌザヌは同情できるからです-むンタヌネットの半分が開かれなくなったからです


わずか1幎前、Bingなどの䞀郚の怜玢ボットによるこのテクノロゞヌの限定的なサポヌトにより、SNIぞの切り替えが劚げられる可胜性がありたしたが、SNIなしでは開かない無料のCloudflare蚌明曞を備えた数十のサむト、Bingボット 怜蚌が容易 、およびボットの出珟により、 他の䞻芁な怜玢゚ンゞンは珟実ず䞀臎しおいたす。 今、このために心配するこずはできたせん。 Googlebotにはこのような問題は䞀床もなかったず思いたす。


心配するもう1぀の理由は、サむトのAPIにアクセスするさたざたな方法です。 長期間APIを䜿甚しおいる堎合、クラむアントの䞭には叀いバヌゞョンのJavaたたはPythonを䜿甚しおいるクラむアントがいる可胜性がわずかにありたす。 持っおいない堎合、心配するこずはありたせん。 ある堎合、私の哀conの意。


SNIに頌る方が良いのはなぜですか


  1. 簡単です。 発行された蚌明曞に関する事実を垞に念頭に眮く必芁はありたせん。 最初に蚌明曞が発行されたドメむン。 ドメむンを远加する必芁がある蚌明曞。 など... SNIでこのようなこずを考える必芁はありたせん。


  2. 秘密は秘密のたたです。 すべおのドメむンに察しお1぀の蚌明曞がある堎合、垌望に関係なく、だれでも簡単にリスト党䜓を衚瀺できたす。 各サむトに独自の蚌明曞がある堎合、そのような問題はありたせん。

たずえば、Thematic Media蚌明曞でドメむンを確認できたす。


true | openssl s_client -showcerts -connect habrahabr.ru:443 2>&1 | openssl x509 -text | grep -o 'DNS:[^,]*' | cut -f2 -d: 

執筆時点で、このコマンドはすべおの可胜なTMドメむンの詳现なリストを衚瀺したす。


 habrastorage.org api.geektimes.ru api.habrahabr.ru geektimes.ru habrahabr.ru id.tmtm.ru lab.geektimes.ru m.geektimes.ru m.habrahabr.ru special.geektimes.ru special.habrahabr.ru www.geektimes.ru www.habrahabr.ru 

秘密も秘密もありたせん。 これが欲しい


Certbotをむンストヌルする


Certbotがすでに資栌や免責事項のないDebian安定版ずUbuntuにある未来からこのテキストを読んでいるなら、すべおが簡単です


 apt-get install certbot 

配垃にはaptitudeたたは別のパッケヌゞマネヌゞャヌを䜿甚しおください。


Jessieでのむンストヌル


2016幎末の時点でただDebian安定版「jessie」を䜿甚しおいる堎合、すべおが少し耇雑です。


  1. /etc/apt/sources.list次の行を远加しお、Debianバックポヌトを有効にする必芁がありたす。


     deb http://ftp.debian.org/debian/ jessie-backports main contrib non-free 

  2. これで、゜ヌスを䜿甚しおむンストヌルできたす。


     apt-get update apt-get install certbot -t jessie-backports 

    このセクションは、 ストレッチのみが安定するたで関連したす。



16.10yakkety以䞋のUbuntuバヌゞョン


 sudo add-apt-repository ppa:certbot/certbot sudo apt-get update sudo apt-get install --upgrade letsencrypt 

さらに、 certbot代わりにcertbot䜿甚しおletsencrypt 。


別の分垃


他のディストリビュヌションがある堎合は、远加のむンストヌル手順がCertbotの公匏Webサむトにありたす。 パッケヌゞマネヌゞャヌを䜿甚しない堎合、通垞、むンストヌルは...


 wget -O /usr/local/bin/certbot-auto https://dl.eff.org/certbot-auto chmod +x /usr/local/bin/certbot-auto ln -s /usr/local/bin/certbot-auto /usr/local/bin/certbot 

以䞋では、 certbotコマンドの代わりにcertbot-autoコマンドを䜿甚できたす。


Certbotずwebroot


Webサヌバヌを再構成たたは停止せずにwebrootメ゜ッドを䜿甚しお蚌明曞を受け取りたす。぀たり、nginxです。 certbotがファむルを曞き蟌むディレクトリが必芁であり、 ACMEプロトコルに埓っおネットワヌクから認蚌サヌバヌにアクセスできる必芁がありたす。


オプションの長い行を毎回曞き蟌たないように、たたはそれらを思い出さないようにするために、 /etc/letsencrypt/cli.ini芋぀けるこずを期埅する構成ファむルにメむン蚭定を曞き蟌みたす。


 authenticator = webroot webroot-path = /var/www/html post-hook = service nginx reload text = True 

最埌のディレクティブは、ncursesの魅力ず矎しさから私たちを救うために必芁です。これは、ここ、この蚘事、そしお自宅でコマンドの出力を比范できるようにするために必芁です。


たた、蚌明曞を正垞に曎新する堎合、nginxをサヌビスを䞭断するこずなく穏やかに再起動する必芁がありたす。 受信した蚌明曞を同時に䜿甚するPostfixなどの他のサヌビスの再起動を劚げるものはありたせん。 コマンドはセミコロンで区切られたす。


セミコロンが゚ラヌを匕き起こす堎合

この゚ラヌが衚瀺される堎合


 letsencrypt: error: Unexpected line 14 in /etc/letsencrypt/cli.ini: post-hook = service nginx reload; service postfix reload 

次に、 python-configargparseを曎新する必芁がありたす。 ゚ラヌは0.11.0で修正されたした 。


Certbotが行うこず


certbotは、指定された階局の䞋のサブディレクトリでドメむン暩限をチェックするために必芁なファむルを䜜成するこずが期埅されおいたす。 これらのように思われる


 /var/www/html/.well-known/acme-challenge/example.html 

これらのファむルは、少なくずもHTTPを介しお、タヌゲットドメむン䞊のネットワヌクからアクセスできる必芁がありたす。


 http://www.example.com/.well-known/acme-challenge/example.html 

次のチェックのために、ある皮のファむルを䜜成したす。


 mkdir -p /var/www/html/.well-known/acme-challenge echo Success > /var/www/html/.well-known/acme-challenge/example.html 

Let's Encryptに参加する


登録は䞀床だけ行う必芁がありたす


 certbot register --email me@example.com 

ここで耇雑なこずはありたせん。


蚌明曞甚にnginxを準備する


䞀般に、蚌明曞を取埗するには、すべおのserverブロックのすべおのlocationブロックに次のブロックを远加する必芁がありserver 。


 location /.well-known { root /var/www/html; } 

各サむトにそのようなブロックを明瀺的に入力するのは/etc/nginx/acmeであるこずは明らかです。したがっお、䞊蚘のブロックの内容でファむル/etc/nginx/acmeを䜜成したす。


 # cat /etc/nginx/acme location /.well-known { root /var/www/html; } 

次に、蚌明曞を取埗するドメむンずサブドメむンごずに、 serverブロックで、すべおのlocationブロックの前に次のようにlocationたす。


 include acme; 

リダむレクトされたホストたずえば、裞のドメむンからwwwぞはスキップできたす。 ACMEサヌバヌは、暙準転送を考慮する必芁がありたす。 詳现に぀いおは、以䞋をご芧ください。


nginxを再起動し、テストファむルが衚瀺されるこずを確認したす。


 # service nginx reload # curl -L http://www.example.com/.well-known/acme-challenge/example.html Success 

チェック埌、テストファむルを削陀するこずをおcertbotたすcertbotはcertbotなものをすべお削陀するのが奜きで、そのようなファむルは干枉しお゚ラヌメッセヌゞチャレンゞディレクトリをクリヌンアップできたせんを匕き起こしたす。


 rm /var/www/html/.well-known/acme-challenge/example.html 

これで、最初の蚌明曞を受け取る準備ができたした。


転送コヌド301および302に぀いお


すでに述べたように、ACME Boulderサヌバヌはコヌド301および302での転送を蚱可しおいたす 。 この意味で、最終的には、チェックに合栌するために必芁なファむルがどこにあるかは問題ではありたせん。 最終的なHTTPたたはHTTPSプロトコルの制限なしに、 非暙準ポヌトにでも転送できたす。 ドメむン暩限をチェックするための単䞀ポむントを䜜成するためにリダむレクトを䜿甚するこずをお勧めしたす 。


10個のリダむレクトを制限しおcurlを䜿甚しおこれらのファむルを取埗できる堎合、ボヌルダヌはこれらのファむルを衚瀺したす。 IPアドレスに制限はないはずです。


 curl --location --max-redirs 10 http://example.com/.well-known/acme-challenge/example.html 

これは、異なるバヌゞョンのサむト間に耇雑なリダむレクト構造がある堎合に䟿利です。 そのブロックをメむンサむトのみのlocationに接続しお、他の党員の蚌明曞を取埗するだけで十分なはずです。


 $ curl --head --silent --location --max-redirs 10 http://somewhere.example.net/... | grep ^HTTP HTTP/1.1 301 Moved Permanently HTTP/1.1 301 Moved Permanently HTTP/1.1 200 OK 

怜蚌は垞に、ポヌト80のHTTPプロトコル芁求で開始されたす。


すべおがすでに暗号化されおいる堎合...


既にすべおのサむトがHTTPSで動䜜しおいる堎合、ポヌト80で転送サヌバヌを構成するず、スキヌム党䜓が機胜し、応答で$request_uriが保存されたす。


もう1぀のこずは、パスを短くしお、ブロックをHTTPSぞの転送を行うポヌト80のデフォルトサヌバヌのlocationに接続できるこずです。 その埌、個々のサむトの構成に䜕かを远加する必芁はありたせん。


このようなオヌルむンワンからHTTPSサヌバヌぞの転送の構成䟋


 server { listen server.example.com:80 default_server; include acme; location / { return 301 https://$host$request_uri; } } 

そのような構成は、特定のサむトの構成ずは別に、 /etc/nginx/conf.d/default.confで定矩する必芁がありたす。


Apacheを別のポヌトに再構成しないように、倖郚IPでサヌバヌを明瀺的に起動したす。 これが問題にならない堎合は、 listenディレクティブでサヌバヌ名の指定をスキップできたす。


サむトのないドメむンの蚌明曞を取埗する必芁がある堎合...


兞型的な䟋は、サむトがたったくないSMTPたたはIMAP専甚サヌバヌの蚌明曞です。 より高いナニバヌサルリダむレクタを䜿甚するか、...


 server { server_name smtp.example.com imap.example.com; listen server.example.com:80; include acme; location / { return 404; } } 

残念ながら、ACMEプロトコルでは、各テスト䞭にそのようなサヌバヌが䜿甚可胜である必芁がありたす。 これは、サヌバヌを再起動せずに蚌明曞を取埗および曎新する必芁があるため、継続的な可甚性ずほが同等です。 蚌明曞を受け取った埌、そのような構成を削陀しないでください。


Apache2しかない堎合...


Apache2があるが、お気に入りのnginxに切り替える方法がない堎合は、次の行を/etc/apache2/conf-available/certbot.conf远加したす。


 Alias /.well-known/ /var/www/html/.well-known/ <Directory /var/www/html/.well-known/> Satisfy any </Directory> 

それから


 a2enconf certbot mkdir -p /var/www/html/.well-known service apache2 reload 

そしお、このように確認しおください


 mkdir -p /var/www/html/.well-known/acme-challenge echo Success > /var/www/html/.well-known/acme-challenge/example.html curl -L http://localhost/.well-known/acme-challenge/example.html && rm /var/www/html/.well-known/acme-challenge/example.html 

Apache2でこのようなスキヌムが機胜しない理由はたくさんありたす。 テキスト画面のペアでは、それらすべおを説明するのに十分ではありたせん。 怒らないでください-nginxに関する蚘事。


蚌明曞を取埗したす


Let's Encryptには蚌明曞のリク゚スト数に制限があるため、たずテストモヌドで必芁な蚌明曞を取埗しおください。


 certbot certonly --dry-run -d example.com -d www.example.com 

最埌に、プログラムは成功した䜜業に぀いお報告する必芁がありたす。


 The dry run was successful. 

これで、実際に蚌明曞を安党に取埗できたす。 wwwなど、必芁なすべおのサブドメむンを明瀺的に指定しおください。


 # certbot certonly -d example.com -d www.example.com Saving debug log to /var/log/letsencrypt/letsencrypt.log Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org Obtaining a new certificate Performing the following challenges: http-01 challenge for example.com http-01 challenge for www.example.com Using the webroot path /var/www/html for all unmatched domains. Waiting for verification... Cleaning up challenges Generating key (2048 bits): /etc/letsencrypt/keys/0001_key-certbot.pem Creating CSR: /etc/letsencrypt/csr/0001_csr-certbot.pem IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will expire on 2017-04-01. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" 

やった 蚌明曞の受け取りが完了したした


蚌明曞にサブドメむンたたはドメむンを远加する必芁がある堎合


突然wwwサブドメむンを指定するのを忘れた堎合、たたは蚌明曞に別のドメむンたたはサブドメむンを远加する必芁がある堎合 1぀の蚌明曞で最倧100 、蚌明曞を受け取った埌にこれを行うのは簡単です。 必芁な名前を远加しお、コマンドを再床実行するだけです。


 certbot certonly -d example.com -d www.example.com -d shop.example.com 

このドメむンを蚌明曞に远加するための代替手段はありたせん。 質問を避けたい堎合は、この動䜜を承認するキヌをすぐに指定できたす。


 certbot certonly --expand -d example.com -d www.example.com -d shop.example.com 

操䜜を繰り返すこずができたす。


受信した蚌明曞を確認する


受け取った蚌明曞が必芁なものであるこずを確認しおください。


 # openssl x509 -text -in /etc/letsencrypt/live/example.com/cert.pem Certificate: Signature Algorithm: ... Validity Not Before: Jan 3 06:00:00 2017 GMT Not After : Apr 3 06:00:00 2017 GMT X509v3 extensions: ... X509v3 Subject Alternative Name: DNS:example.com, DNS:www.example.com 

たたは、詳现が必芁ない堎合


 cat /etc/letsencrypt/live/*/cert.pem | openssl x509 -text | grep -o 'DNS:[^,]*' | cut -f2 -d: 

チヌムは、蚌明曞にドメむンをリストする必芁がありたす。


蚌明曞をむンストヌルしお䜿甚する


Certbotは蚌明曞を曞き換えたせんが、最初の蚌明曞ドメむン CN ず同じ名前の特定のディレクトリにある最新の蚌明曞オプションぞのリンクに眮き換えたす。


どんな皮類のファむルがあるのか​​芋おみたしょう。


  # find /etc/letsencrypt/live/ -type l /etc/letsencrypt/live/example.com/fullchain.pem /etc/letsencrypt/live/example.com/chain.pem /etc/letsencrypt/live/example.com/privkey.pem /etc/letsencrypt/live/example.com/cert.pem 

この知識があれば、nginxのSSL蚭定を蚭定できたす。


 ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem; 

ご芧のずおり、 cert.pemは構成内のどこでも䜿甚されおおらず、これぱラヌではありたせん。 nginxの堎合、必芁ありたせん。


完党に機胜するサンプル蚭定


 server { server_name www.example.com; listen www.example.com:443 ssl; # default_server; #    default_server    SNI ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem; ssl_stapling on; ssl_stapling_verify on; resolver 127.0.0.1 8.8.8.8; #    http-  add_header Strict-Transport-Security "max-age=31536000"; #  ""    http:// add_header Content-Security-Policy "img-src https: data:; upgrade-insecure-requests"; #       #location / { # proxy_pass ...; #} } 

wwwなしでベアドメむンからリダむレクトするように構成したす。


 server { server_name example.com; listen example.com:443 ssl; access_log off; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem; ssl_stapling on; ssl_stapling_verify on; resolver 127.0.0.1 8.8.8.8; add_header Strict-Transport-Security "max-age=31536000"; expires max; return 301 https://www.example.com$request_uri; } 

䜕らかの皮類のロヌカルサヌバヌを䜿甚しおDNSク゚リをキャッシュしおいるこずがわかりたす。 そうでない堎合は、 resolverディレクティブの127.0.0.1を䜿甚するDNSサヌバヌのIPに眮き換える必芁がありたす。


暗号蚭定など ssl_dhparam 、 ssl_session_cache を個々のサヌバヌの構成倖にssl_dhparamをおssl_session_cacheたす。


完党な秘密


Certbotがオヌプン゜ヌスコヌドにもかかわらず蚌明曞のキヌを盗むこずを心配しおいる堎合、理論的には、䞀郚の悪人がすべおのトラフィックを解読できるこずを意味したす。 サむトぞの接続にDHEおよびECDHEファミリヌの暗号が䜿甚されおいる堎合、キヌリヌクによりトラフィックの埩号化が蚱可されたせん。 これらの暗号では、蚌明曞キヌは認蚌にのみ䜿甚され、暗号化のキヌずしおは䜿甚されたせん。 最新のブラりザはすべお、これらの暗号をサポヌトしおいたす。


ECDHEの楕円曲線で䜕もする必芁がない堎合、拡匵パラメヌタヌをDHEに䜿甚できたす。 DHEを完党に無効にするこずをお勧めしたす。


䜕らかの理由でDHEなしではできない堎合

䜕らかの理由でDHEなしではできない堎合は、最初にパラメヌタヌを䜜成したす。


 openssl dhparam -out /etc/ssl/private/dhparam.pem 2048 

次に、 /etc/nginx/conf.d/ssl_dhparam.conf 1行/etc/nginx/conf.d/ssl_dhparam.conf曞き蟌みたす。


 ssl_dhparam /etc/ssl/private/dhparam.pem; 

蚌明曞の曎新


蚌明曞は3か月間発行されたす。 半幎も、1幎も、3か月だけではありたせん。 圓然、これにより疑問が生じたす。 3か月でこの手順党䜓を実行する必芁がありたすか 数䞖玀の終わりたでこれを行うこずは垞に必芁ですか たぶん、あなたはそれをすべお忘れお、数幎を芚えおいないために、ただ支払われた蚌明曞に投資するべきですか


しかし、いや、支払い手段を探すために急いではいけたせん 蚘事の冒頭で玄束したように、蚌明曞の曎新に問題はありたせん。


Debianを䜿甚しおいる堎合は、 --allow-subset-of-namesキヌを/etc/cron.d/certbot --allow-subset-of-names呌び出しに远加するだけです。


 #    /etc/cron.d/certbot #  certbot -q renew,   certbot -q renew --allow-subset-of-names 

Debianずsystemdを䜿甚しおいる堎合は、 これらの手順を確認しおください 。


Debianがない堎合、たたはファむルがない堎合は、 rootからcrontab 1行だけ远加したす sudo crontab -e 


 42 */12 * * * certbot renew --quiet --allow-subset-of-names 

Let's Encryptで掚奚されおいるように、蚌明曞を1日に2回曎新するようにしおください。 その時間のランダムに遞択された分でこれを行う必芁がありたす。぀たり、この行の42を0〜59の範囲の別の数倀に眮き換える必芁がありたす。 たたは、/ /etc/cron.d/certbotで行われおいる/etc/cron.d/certbot実行できたす。


仕組み


このコマンドでは、 --allow-subset-of-namesがドメむンの郚分セットの蚌明曞を取埗しようずするために、キヌ--allow-subset-of-names必芁です。


たずえば、サヌバヌサむトにwww.example.comずshop.example.comがあり 、1぀の蚌明曞の䞋を通過したしたが、 shop.example.comを別のサヌバヌに転送したした。 そのようなキヌを指定しない堎合、Certbotは倱敗し、蚌明曞をたったく受け取らずにshop.example.comの所有暩を確認しようずしたす。 蚌明曞の有効期限が切れ、サむトがオフラむンになりたす。 このキヌを䜿甚するず、少なくずも䞀郚のドメむンセットの蚌明曞を受け取り、サむトをネットワヌク䞊に残したす。


それだけです


teeおよびsedに粟通しおいる堎合は、 hostname正しく構成されおいれば、 Let's Encryptおよびnginxバンドルをセットアップするためのはるかに短い指瀺 hostnameたす。 コマンドをコピヌしお貌り付けるだけです。




間違いを芋぀けたしたか 個人的に曞いおください。



Source: https://habr.com/ru/post/J318952/


All Articles