{"id":1068,"date":"2022-05-18T06:23:22","date_gmt":"2022-05-18T06:23:22","guid":{"rendered":"https:\/\/oimi.me\/?p=1068"},"modified":"2022-05-18T06:23:22","modified_gmt":"2022-05-18T06:23:22","slug":"%e4%bd%bf%e7%94%a8-github-actions-%e8%87%aa%e5%8a%a8%e7%94%b3%e8%af%b7%e4%b8%8e%e9%83%a8%e7%bd%b2-ssl-%e8%af%81%e4%b9%a6","status":"publish","type":"post","link":"https:\/\/myya.net\/index.php\/2022\/05\/18\/%e4%bd%bf%e7%94%a8-github-actions-%e8%87%aa%e5%8a%a8%e7%94%b3%e8%af%b7%e4%b8%8e%e9%83%a8%e7%bd%b2-ssl-%e8%af%81%e4%b9%a6\/","title":{"rendered":"\u4f7f\u7528 GitHub Actions \u81ea\u52a8\u7533\u8bf7\u4e0e\u90e8\u7f72 SSL \u8bc1\u4e66"},"content":{"rendered":"<p>\u5bf9\u4e8e\u4e00\u4e2a\u6709\u5f88\u591a\u670d\u52a1\u5668\u7684\u4eba\u6765\u8bf4\uff0c\u5728\u4e0d\u540c\u670d\u52a1\u5668\u4e0a\u540c\u6b65 SSL \u8bc1\u4e66\u662f\u4e00\u4ef6\u9ebb\u70e6\u4e8b\u3002\u7b14\u8005\u5c1d\u8bd5\u8fc7\u5f88\u591a\u79cd\u65b9\u5f0f\uff0c\u6700\u540e\u5728\u00a0<a href=\"https:\/\/men.ci\/\" rel=\"external nofollow noreferrer\">Menci<\/a>\u00a0\u7684\u63a8\u8350\u4e0b\u9009\u5b9a\u4e86\u4f7f\u7528 GitHub Actions \u6765\u81ea\u52a8\u7533\u8bf7\u3001\u7eed\u671f SSL \u8bc1\u4e66\uff0c\u5e76\u81ea\u52a8\u63a8\u9001\u5230\u5404\u4e2a\u670d\u52a1\u5668\u4e0a\u3002<\/p>\n<p>\u672c\u535a\u5ba2\u7684\u8bc1\u4e66\u4e5f\u662f\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u7b7e\u53d1\u3001\u90e8\u7f72\u7684\uff0c\u53ef\u4ee5\u70b9\u51fb\u6d4f\u89c8\u5668\u5730\u5740\u680f\u4e0a\u7684\u6309\u94ae\u67e5\u770b\u8bc1\u4e66\u3002<!--more--><\/p>\n<h2 id=\"\u7533\u8bf7\u8bc1\u4e66\">\u7533\u8bf7\u8bc1\u4e66<\/h2>\n<h3 id=\"\u524d\u671f\u51c6\u5907\">\u524d\u671f\u51c6\u5907<\/h3>\n<p>\u9996\u5148\u8bf7\u5728\u672c\u5730\uff08\u6216\u81ea\u5df1\u7684\u670d\u52a1\u5668\u4e0a\uff09\u6210\u529f\u4f7f\u7528\u00a0<a href=\"https:\/\/acme.sh\/\" rel=\"external nofollow noreferrer\">acme.sh<\/a>\u00a0\u7684\u00a0<a href=\"https:\/\/letsencrypt.org\/docs\/challenge-types\/#dns-01-challenge\" rel=\"external nofollow noreferrer\">DNS-01<\/a> \u9a8c\u8bc1\u65b9\u5f0f\u6210\u529f\u7533\u8bf7\u4e00\u6b21\u8bc1\u4e66\uff0c<\/p>\n<ol>\n<li>\u5411 CA \u6ce8\u518c ACME \u8d26\u6237\uff08\u5982\u679c\u4f7f\u7528 Let\u2019s Encrypt \u5219\u4f1a\u81ea\u52a8\u8fdb\u884c\uff0c\u8be6\u7ec6\u6b65\u9aa4\u8bf7\u53c2\u9605\u00a0<a href=\"https:\/\/github.com\/acmesh-official\/acme.sh\/wiki\/ZeroSSL.com-CA\" rel=\"external nofollow noreferrer\">acme.sh \u7684 Wiki<\/a>\uff09\u3002<\/li>\n<li>\u901a\u8fc7\u73af\u5883\u53d8\u91cf\u6307\u5b9a DNS \u63d0\u4f9b\u5546\u7684\u51ed\u636e\uff0c\u7528\u4e8e\u6dfb\u52a0\/\u5220\u9664 ACME DNS-01 \u8ba4\u8bc1\u6240\u9700\u7684 TXT \u8bb0\u5f55\u3002<\/li>\n<li>\u786e\u8ba4\u8bc1\u4e66\u7533\u8bf7\u53ef\u4ee5\u6210\u529f\uff0c\u4e3a\u540e\u7eed\u8c03\u8bd5\u6392\u9664\u53ef\u80fd\u7684\u95ee\u9898\u3002<\/li>\n<\/ol>\n<p>\u7b2c\u4e00\u6b21\u7533\u8bf7\u8bc1\u4e66\u540e\uff0cCA \u7684 ACME \u8d26\u6237\u51ed\u636e\u5c06\u88ab\u5b58\u50a8\u5230\u00a0<code>~\/.acme.sh\/ca<\/code>\u00a0\u4e2d\uff0cDNS \u63d0\u4f9b\u5546\u7684\u51ed\u636e\u5c06\u88ab\u5b58\u50a8\u5230\u00a0<code>~\/.acme.sh\/account.conf<\/code>\u00a0\u4e2d\u3002\u5c06\u5b83\u4eec\u6253\u5305\u5e76\u4f7f\u7528 Base64 \u7f16\u7801\u5b58\u50a8\uff0c\u4ee5\u5907\u5728 GitHub Actions \u4e2d\u4f7f\u7528\uff1a<\/p>\n<pre><code class=\"hljs sh\"><span class=\"hljs-built_in\">cd<\/span> ~\/.acme.sh\ntar cz ca account.conf | <span class=\"hljs-built_in\">base64<\/span> -w0<\/code><\/pre>\n<p>\u5c06\u8f93\u51fa\u5185\u5bb9\u6dfb\u52a0\u5230 GitHub \u4ed3\u5e93\u7684 Secrets \u4e2d\u3002\u6ce8\u610f\u4e0d\u8981\u590d\u5236\u8f93\u51fa\u4e2d\u7684\u591a\u4f59\u4fe1\u606f\u3002<\/p>\n<h3 id=\"\u81ea\u52a8\u5316\">\u81ea\u52a8\u5316<\/h3>\n<p>\u5982\u679c\u6ca1\u6709\u7279\u6b8a\u9700\u6c42\uff0c\u53ef\u4ee5\u4f7f\u7528\u00a0<a href=\"https:\/\/github.com\/Menci\/acme\" rel=\"external nofollow noreferrer\">Menci\/acme<\/a>\u00a0\u6765\u7b80\u5355\u5730\u7533\u8bf7\u8bc1\u4e66\uff1a<\/p>\n<pre><code class=\"hljs yaml\"><span class=\"hljs-comment\"># \u5168\u5c40\u73af\u5883\u53d8\u91cf<\/span>\n<span class=\"hljs-attr\">env:<\/span>\n  <span class=\"hljs-comment\"># Checkout \u5230\u7684\u76ee\u5f55<\/span>\n  <span class=\"hljs-attr\">CERTS_OUTPUT_BASE:<\/span> <span class=\"hljs-string\">certs<\/span>\n  <span class=\"hljs-comment\"># \u8bc1\u4e66\u8f93\u51fa\u76ee\u5f55<\/span>\n  <span class=\"hljs-attr\">CERTS_OUTPUT_DIRECTORY:<\/span> <span class=\"hljs-string\">example.com<\/span>\n  <span class=\"hljs-comment\"># \u8bc1\u4e66\u6587\u4ef6\u540d<\/span>\n  <span class=\"hljs-attr\">FILE_FULLCHAIN:<\/span> <span class=\"hljs-string\">fullchain.pem<\/span>\n  <span class=\"hljs-comment\"># \u79c1\u94a5\u6587\u4ef6\u540d<\/span>\n  <span class=\"hljs-attr\">FILE_KEY:<\/span> <span class=\"hljs-string\">privatekey.key<\/span>\n\n<span class=\"hljs-attr\">jobs:<\/span>\n  <span class=\"hljs-attr\">issue-ssl-certificate:<\/span>\n    <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Issue<\/span> <span class=\"hljs-string\">SSL<\/span> <span class=\"hljs-string\">certificate<\/span>\n    <span class=\"hljs-attr\">runs-on:<\/span> <span class=\"hljs-string\">ubuntu-latest<\/span>\n    <span class=\"hljs-attr\">steps:<\/span>\n      <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">uses:<\/span> <span class=\"hljs-string\">Menci\/acme@v1<\/span>\n        <span class=\"hljs-attr\">with:<\/span>\n          <span class=\"hljs-comment\"># \u6307\u5b9a acme.sh \u7684\u7248\u672c<\/span>\n          <span class=\"hljs-attr\">version:<\/span> <span class=\"hljs-number\">3.0<\/span><span class=\"hljs-number\">.2<\/span>\n\n          <span class=\"hljs-comment\"># \u4e0a\u65b9\u4fdd\u5b58\u7684\u4ee5 Base64 \u7f16\u7801\u5b58\u50a8\u7684\u51ed\u636e<\/span>\n          <span class=\"hljs-attr\">account-tar:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">secrets.ACME_SH_ACCOUNT_TAR<\/span> <span class=\"hljs-string\">}}<\/span>\n\n          <span class=\"hljs-comment\"># \u57df\u540d\u5217\u8868\uff0c\u4ee5\u7a7a\u683c\u5206\u9694<\/span>\n          <span class=\"hljs-attr\">domains:<\/span> <span class=\"hljs-string\">example.com<\/span> <span class=\"hljs-string\">example.net<\/span> <span class=\"hljs-string\">example.org<\/span> <span class=\"hljs-string\">example.edu<\/span>\n          <span class=\"hljs-comment\"># \u662f\u5426\u7533\u8bf7\u901a\u914d\u7b26<\/span>\n          <span class=\"hljs-attr\">append-wildcard:<\/span> <span class=\"hljs-literal\">true<\/span>\n\n          <span class=\"hljs-comment\"># \u4f20\u9012\u7ed9 acme.sh \u7684\u989d\u5916\u53c2\u6570<\/span>\n          <span class=\"hljs-attr\">arguments:<\/span> <span class=\"hljs-string\">--dns<\/span> <span class=\"hljs-string\">dns_cf<\/span> <span class=\"hljs-string\">--challenge-alias<\/span> <span class=\"hljs-string\">example.com<\/span>\n\n          <span class=\"hljs-comment\"># \u5bfc\u51fa\u7684\u8bc1\u4e66\u8def\u5f84<\/span>\n          <span class=\"hljs-attr\">output-fullchain:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">env.CERTS_OUTPUT_BASE<\/span> <span class=\"hljs-string\">}}\/${{<\/span> <span class=\"hljs-string\">env.CERTS_OUTPUT_DIRECTORY<\/span> <span class=\"hljs-string\">}}\/${{<\/span> <span class=\"hljs-string\">env.FILE_FULLCHAIN<\/span> <span class=\"hljs-string\">}}<\/span>\n          <span class=\"hljs-attr\">output-key:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">env.CERTS_OUTPUT_BASE<\/span> <span class=\"hljs-string\">}}\/${{<\/span> <span class=\"hljs-string\">env.CERTS_OUTPUT_DIRECTORY<\/span> <span class=\"hljs-string\">}}\/${{<\/span> <span class=\"hljs-string\">env.FILE_KEY<\/span> <span class=\"hljs-string\">}}<\/span><\/code><\/pre>\n<p>\u5982\u679c\u9700\u8981\u9ad8\u5ea6\u81ea\u5b9a\u4e49\u00a0<a href=\"http:\/\/acme.sh\/\" rel=\"external nofollow noreferrer\">acme.sh<\/a>\u00a0\u7684\u53c2\u6570\uff0c\u6bd4\u5982\u4e3a\u4e0d\u540c\u7684\u57df\u540d\u8bbe\u7f6e\u4e0d\u540c\u7684 DNS \u63d0\u4f9b\u5546\uff0c\u53ef\u4ee5\u4f7f\u7528\u4e0b\u9762\u7684\u65b9\u5f0f\u624b\u52a8\u7f16\u5199\u547d\u4ee4\u6765\u6267\u884c\uff1a<\/p>\n<pre><code class=\"hljs yaml\"><span class=\"hljs-comment\"># \u5168\u5c40\u73af\u5883\u53d8\u91cf<\/span>\n<span class=\"hljs-attr\">env:<\/span>\n  <span class=\"hljs-comment\"># Checkout \u5230\u7684\u76ee\u5f55<\/span>\n  <span class=\"hljs-attr\">CERTS_OUTPUT_BASE:<\/span> <span class=\"hljs-string\">certs<\/span>\n  <span class=\"hljs-comment\"># \u8bc1\u4e66\u8f93\u51fa\u76ee\u5f55<\/span>\n  <span class=\"hljs-attr\">CERTS_OUTPUT_DIRECTORY:<\/span> <span class=\"hljs-string\">example.com<\/span>\n  <span class=\"hljs-comment\"># \u8bc1\u4e66\u6587\u4ef6\u540d<\/span>\n  <span class=\"hljs-attr\">FILE_FULLCHAIN:<\/span> <span class=\"hljs-string\">fullchain.pem<\/span>\n  <span class=\"hljs-comment\"># \u79c1\u94a5\u6587\u4ef6\u540d<\/span>\n  <span class=\"hljs-attr\">FILE_KEY:<\/span> <span class=\"hljs-string\">privatekey.key<\/span>\n\n<span class=\"hljs-attr\">jobs:<\/span>\n  <span class=\"hljs-attr\">issue-ssl-certificate:<\/span>\n    <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Issue<\/span> <span class=\"hljs-string\">SSL<\/span> <span class=\"hljs-string\">certificate<\/span>\n    <span class=\"hljs-attr\">runs-on:<\/span> <span class=\"hljs-string\">ubuntu-latest<\/span>\n    <span class=\"hljs-attr\">steps:<\/span>\n      <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Checkout<\/span>\n        <span class=\"hljs-attr\">uses:<\/span> <span class=\"hljs-string\">actions\/checkout@v2<\/span>\n        <span class=\"hljs-attr\">with:<\/span>\n          <span class=\"hljs-attr\">ref:<\/span> <span class=\"hljs-string\">master<\/span>\n\n      <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Checkout<\/span> <span class=\"hljs-string\">output<\/span> <span class=\"hljs-string\">branch<\/span>\n        <span class=\"hljs-attr\">uses:<\/span> <span class=\"hljs-string\">actions\/checkout@v2<\/span>\n        <span class=\"hljs-attr\">with:<\/span>\n          <span class=\"hljs-attr\">ref:<\/span> <span class=\"hljs-string\">certs<\/span>\n          <span class=\"hljs-attr\">path:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">env.CERTS_OUTPUT_BASE<\/span> <span class=\"hljs-string\">}}<\/span>\n\n      <span class=\"hljs-comment\"># \u5b89\u88c5 acme.sh<\/span>\n      <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Install<\/span> <span class=\"hljs-string\">acme.sh<\/span>\n        <span class=\"hljs-attr\">shell:<\/span> <span class=\"hljs-string\">bash<\/span>\n        <span class=\"hljs-attr\">run:<\/span> <span class=\"hljs-string\">curl<\/span> <span class=\"hljs-string\">-s<\/span> <span class=\"hljs-string\">https:\/\/get.acme.sh<\/span> <span class=\"hljs-string\">|<\/span> <span class=\"hljs-string\">sh<\/span>\n\n      <span class=\"hljs-comment\"># \u89e3\u538b acme.sh \u914d\u7f6e\u4fe1\u606f<\/span>\n      <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Extract<\/span> <span class=\"hljs-string\">account<\/span> <span class=\"hljs-string\">files<\/span> <span class=\"hljs-string\">for<\/span> <span class=\"hljs-string\">acme.sh<\/span>\n        <span class=\"hljs-attr\">shell:<\/span> <span class=\"hljs-string\">bash<\/span>\n        <span class=\"hljs-attr\">run:<\/span> <span class=\"hljs-string\">|<\/span>\n<span class=\"hljs-string\">          echo \"$ACME_SH_ACCOUNT_TAR\" | base64 -d | tar -C ~\/.acme.sh -xz<\/span>\n        <span class=\"hljs-attr\">env:<\/span>\n          <span class=\"hljs-comment\"># Base64 \u7f16\u7801\u7684 acme.sh \u914d\u7f6e\u4fe1\u606f<\/span>\n          <span class=\"hljs-attr\">ACME_SH_ACCOUNT_TAR:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">secrets.ACME_SH_ACCOUNT_TAR<\/span> <span class=\"hljs-string\">}}<\/span>\n\n      <span class=\"hljs-comment\"># \u7533\u8bf7\u8bc1\u4e66<\/span>\n      <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Issue<\/span> <span class=\"hljs-string\">SSL<\/span> <span class=\"hljs-string\">certificates<\/span>\n        <span class=\"hljs-attr\">shell:<\/span> <span class=\"hljs-string\">bash<\/span>\n        <span class=\"hljs-attr\">run:<\/span> <span class=\"hljs-string\">|<\/span>\n<span class=\"hljs-string\">          ~\/.acme.sh\/acme.sh --issue        \\<\/span>\n<span class=\"hljs-string\">            -d \"example.com\"   --dns dns_cf \\<\/span>\n<span class=\"hljs-string\">            -d \"*.example.com\" --dns dns_cf \\<\/span>\n<span class=\"hljs-string\">            -d \"example.net\"   --dns dns_dp \\<\/span>\n<span class=\"hljs-string\">            -d \"*.example.net\" --dns dns_dp \\<\/span>\n<span class=\"hljs-string\">            --server letsencrypt<\/span>\n\n      <span class=\"hljs-comment\"># \u5bfc\u51fa\u8bc1\u4e66<\/span>\n      <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Copy<\/span> <span class=\"hljs-string\">certificate<\/span> <span class=\"hljs-string\">to<\/span> <span class=\"hljs-string\">output<\/span> <span class=\"hljs-string\">paths<\/span>\n        <span class=\"hljs-attr\">shell:<\/span> <span class=\"hljs-string\">bash<\/span>\n        <span class=\"hljs-attr\">run:<\/span> <span class=\"hljs-string\">|<\/span>\n<span class=\"hljs-string\">          ACME_SH_TEMP_DIR=\"$(mktemp -d)\"<\/span>\n<span class=\"hljs-string\">          ACME_SH_TEMP_FILE_FULLCHAIN=\"$ACME_SH_TEMP_DIR\/fullchain.pem\"<\/span>\n<span class=\"hljs-string\">          ACME_SH_TEMP_FILE_KEY=\"$ACME_SH_TEMP_DIR\/key.pem\"<\/span>\n\n          <span class=\"hljs-string\">~\/.acme.sh\/acme.sh<\/span> <span class=\"hljs-string\">--install-cert<\/span> <span class=\"hljs-string\">-d<\/span> <span class=\"hljs-string\">\"$ACME_SH_FIRST_DOMAIN\"<\/span> <span class=\"hljs-string\">--fullchain-file<\/span> <span class=\"hljs-string\">\"$ACME_SH_TEMP_FILE_FULLCHAIN\"<\/span> <span class=\"hljs-string\">--key-file<\/span> <span class=\"hljs-string\">\"$ACME_SH_TEMP_FILE_KEY\"<\/span>\n\n          [[ <span class=\"hljs-string\">-z<\/span> <span class=\"hljs-string\">\"$ACME_SH_OUTPUT_FULLCHAIN\"<\/span> ]] <span class=\"hljs-string\">||<\/span> <span class=\"hljs-string\">(mkdir<\/span> <span class=\"hljs-string\">-p<\/span> <span class=\"hljs-string\">\"$(dirname \"<\/span><span class=\"hljs-string\">$ACME_SH_OUTPUT_FULLCHAIN\")\"<\/span> <span class=\"hljs-string\">&amp;&amp;<\/span> <span class=\"hljs-string\">cp<\/span> <span class=\"hljs-string\">\"$ACME_SH_TEMP_FILE_FULLCHAIN\"<\/span> <span class=\"hljs-string\">\"$ACME_SH_OUTPUT_FULLCHAIN\"<\/span><span class=\"hljs-string\">)<\/span>\n          [[ <span class=\"hljs-string\">-z<\/span> <span class=\"hljs-string\">\"$ACME_SH_OUTPUT_KEY\"<\/span> ]] <span class=\"hljs-string\">||<\/span> <span class=\"hljs-string\">(mkdir<\/span> <span class=\"hljs-string\">-p<\/span> <span class=\"hljs-string\">\"$(dirname \"<\/span><span class=\"hljs-string\">$ACME_SH_OUTPUT_KEY\")\"<\/span> <span class=\"hljs-string\">&amp;&amp;<\/span> <span class=\"hljs-string\">cp<\/span> <span class=\"hljs-string\">\"$ACME_SH_TEMP_FILE_KEY\"<\/span> <span class=\"hljs-string\">\"$ACME_SH_OUTPUT_KEY\"<\/span><span class=\"hljs-string\">)<\/span>\n\n          <span class=\"hljs-string\">rm<\/span> <span class=\"hljs-string\">-rf<\/span> <span class=\"hljs-string\">\"$ACME_SH_TEMP_DIR\"<\/span>\n        <span class=\"hljs-attr\">env:<\/span>\n          <span class=\"hljs-comment\"># \u4fee\u6539\u6b64\u5904\u7684 example.com \u4e3a\u7533\u8bf7\u65f6\u586b\u5199\u7684\u7b2c\u4e00\u4e2a\u57df\u540d<\/span>\n          <span class=\"hljs-attr\">ACME_SH_FIRST_DOMAIN:<\/span> <span class=\"hljs-string\">example.com<\/span>\n          <span class=\"hljs-attr\">ACME_SH_OUTPUT_FULLCHAIN:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">env.CERTS_OUTPUT_BASE<\/span> <span class=\"hljs-string\">}}\/${{<\/span> <span class=\"hljs-string\">env.CERTS_OUTPUT_DIRECTORY<\/span> <span class=\"hljs-string\">}}\/${{<\/span> <span class=\"hljs-string\">env.FILE_FULLCHAIN<\/span> <span class=\"hljs-string\">}}<\/span>\n          <span class=\"hljs-attr\">ACME_SH_OUTPUT_KEY:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">env.CERTS_OUTPUT_BASE<\/span> <span class=\"hljs-string\">}}\/${{<\/span> <span class=\"hljs-string\">env.CERTS_OUTPUT_DIRECTORY<\/span> <span class=\"hljs-string\">}}\/${{<\/span> <span class=\"hljs-string\">env.FILE_KEY<\/span> <span class=\"hljs-string\">}}<\/span><\/code><\/pre>\n<h3 id=\"\u4e0a\u4f20\u8bc1\u4e66\u81f3\u4ed3\u5e93\">\u4e0a\u4f20\u8bc1\u4e66\u81f3\u4ed3\u5e93<\/h3>\n<pre><code class=\"hljs yaml\"><span class=\"hljs-comment\"># \u4e0a\u4f20\u8bc1\u4e66<\/span>\n<span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Push<\/span> <span class=\"hljs-string\">to<\/span> <span class=\"hljs-string\">GitHub<\/span>\n  <span class=\"hljs-attr\">run:<\/span> <span class=\"hljs-string\">|<\/span>\n<span class=\"hljs-string\">    git config --global user.name \"BaoshuoBot\"<\/span>\n<span class=\"hljs-string\">    git config --global user.email \"79077260+BaoshuoBot@users.noreply.github.com\"<\/span>\n\n    <span class=\"hljs-string\">cd<\/span> <span class=\"hljs-string\">\"$CERTS_DIRECTORY\"<\/span>\n\n    <span class=\"hljs-string\">git<\/span> <span class=\"hljs-string\">add<\/span> <span class=\"hljs-string\">\"$FILE_FULLCHAIN\"<\/span> <span class=\"hljs-string\">\"$FILE_KEY\"<\/span>\n    <span class=\"hljs-string\">git<\/span> <span class=\"hljs-string\">commit<\/span> <span class=\"hljs-string\">-m<\/span> <span class=\"hljs-string\">\"Upload certificates on $(date '+%Y-%m-%d %H:%M:%S')\"<\/span>\n    <span class=\"hljs-string\">git<\/span> <span class=\"hljs-string\">push<\/span>\n  <span class=\"hljs-attr\">env:<\/span>\n    <span class=\"hljs-attr\">TZ:<\/span> <span class=\"hljs-string\">Asia\/Shanghai<\/span>\n    <span class=\"hljs-attr\">CERTS_DIRECTORY:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">env.CERTS_OUTPUT_BASE<\/span> <span class=\"hljs-string\">}}\/${{<\/span> <span class=\"hljs-string\">env.CERTS_OUTPUT_DIRECTORY<\/span> <span class=\"hljs-string\">}}<\/span><\/code><\/pre>\n<h2 id=\"\u90e8\u7f72\u8bc1\u4e66\">\u90e8\u7f72\u8bc1\u4e66<\/h2>\n<p>\u5728\u7533\u8bf7\u8bc1\u4e66\u7684 Job \u6267\u884c\u5b8c\u6210\u540e\uff0c\u53ef\u4ee5\u6267\u884c\u4e00\u7cfb\u5217\u5176\u4ed6\u7684 Job \u6765\u5c06\u8bc1\u4e66\u90e8\u7f72\u5230\u5404\u4e2a\u670d\u52a1\u5668\u6216\u4e91\u670d\u52a1\u3002<\/p>\n<h3 id=\"\u670d\u52a1\u5668\">\u670d\u52a1\u5668<\/h3>\n<p>\u53ef\u4ee5\u4f7f\u7528\u00a0<a href=\"https:\/\/github.com\/easingthemes\/ssh-deploy\" rel=\"external nofollow noreferrer\"><code>easingthemes\/ssh-deploy<\/code><\/a>\u00a0\u6765\u4f7f\u7528 rsync \u5c06\u8bc1\u4e66\u540c\u6b65\u5230\u670d\u52a1\u5668\u4e0a\u3002\u540c\u6b65\u5b8c\u6210\u540e\u518d\u4f7f\u7528\u00a0<a href=\"https:\/\/github.com\/appleboy\/ssh-action\" rel=\"external nofollow noreferrer\"><code>appleboy\/ssh-action<\/code><\/a>\u00a0\u8fdc\u7a0b\u6267\u884c\u547d\u4ee4\u91cd\u8f7d Nginx \/ Apache\u3002<\/p>\n<pre><code class=\"hljs yaml\"><span class=\"hljs-comment\"># \u90e8\u7f72\u5230\u670d\u52a1\u5668<\/span>\n<span class=\"hljs-attr\">deploy-to-server:<\/span>\n  <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Deploy<\/span> <span class=\"hljs-string\">Certificate<\/span> <span class=\"hljs-string\">to<\/span> <span class=\"hljs-string\">Server<\/span>\n  <span class=\"hljs-attr\">runs-on:<\/span> <span class=\"hljs-string\">ubuntu-latest<\/span>\n  <span class=\"hljs-attr\">needs:<\/span> <span class=\"hljs-string\">issue-ssl-certificate<\/span>\n\n  <span class=\"hljs-attr\">strategy:<\/span>\n    <span class=\"hljs-attr\">matrix:<\/span>\n      <span class=\"hljs-attr\">host:<\/span>\n        <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-number\">174.136<\/span><span class=\"hljs-number\">.239<\/span><span class=\"hljs-number\">.1<\/span> <span class=\"hljs-comment\"># Server 1<\/span>\n        <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-number\">174.136<\/span><span class=\"hljs-number\">.239<\/span><span class=\"hljs-number\">.2<\/span> <span class=\"hljs-comment\"># Server 2<\/span>\n        <span class=\"hljs-comment\"># ...<\/span>\n        <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-number\">174.136<\/span><span class=\"hljs-number\">.239<\/span><span class=\"hljs-number\">.254<\/span> <span class=\"hljs-comment\"># Server N<\/span>\n\n  <span class=\"hljs-attr\">steps:<\/span>\n    <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Checkout<\/span>\n      <span class=\"hljs-attr\">uses:<\/span> <span class=\"hljs-string\">actions\/checkout@v2<\/span>\n      <span class=\"hljs-attr\">with:<\/span>\n        <span class=\"hljs-attr\">ref:<\/span> <span class=\"hljs-string\">certs<\/span>\n\n    <span class=\"hljs-comment\"># \u4e0a\u4f20\u8bc1\u4e66<\/span>\n    <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Upload<\/span> <span class=\"hljs-string\">certificate<\/span> <span class=\"hljs-string\">to<\/span> <span class=\"hljs-string\">server<\/span>\n      <span class=\"hljs-attr\">uses:<\/span> <span class=\"hljs-string\">easingthemes\/ssh-deploy@v2.1.5<\/span>\n      <span class=\"hljs-attr\">env:<\/span>\n        <span class=\"hljs-attr\">SSH_PRIVATE_KEY:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">secrets.SSH_PRIVATE_KEY<\/span> <span class=\"hljs-string\">}}<\/span>\n        <span class=\"hljs-attr\">ARGS:<\/span> <span class=\"hljs-string\">'-avz --delete'<\/span>\n        <span class=\"hljs-attr\">REMOTE_HOST:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">matrix.host<\/span> <span class=\"hljs-string\">}}<\/span>\n        <span class=\"hljs-attr\">REMOTE_USER:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">secrets.REMOTE_USER<\/span> <span class=\"hljs-string\">}}<\/span>\n        <span class=\"hljs-attr\">SOURCE:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">env.CERTS_OUTPUT_DIRECTORY<\/span> <span class=\"hljs-string\">}}\/<\/span>\n        <span class=\"hljs-attr\">TARGET:<\/span> <span class=\"hljs-string\">\/path\/to\/ssl\/certs\/${{<\/span> <span class=\"hljs-string\">env.CERTS_OUTPUT_DIRECTORY<\/span> <span class=\"hljs-string\">}}\/<\/span>\n\n    <span class=\"hljs-comment\"># \u91cd\u8f7d Nginx<\/span>\n    <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Force-reload<\/span> <span class=\"hljs-string\">nginx<\/span>\n      <span class=\"hljs-attr\">uses:<\/span> <span class=\"hljs-string\">appleboy\/ssh-action@v0.1.4<\/span>\n      <span class=\"hljs-attr\">with:<\/span>\n        <span class=\"hljs-attr\">host:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">matrix.host<\/span> <span class=\"hljs-string\">}}<\/span>\n        <span class=\"hljs-attr\">username:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">secrets.REMOTE_USER<\/span> <span class=\"hljs-string\">}}<\/span>\n        <span class=\"hljs-attr\">key:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">secrets.SSH_PRIVATE_KEY<\/span> <span class=\"hljs-string\">}}<\/span>\n        <span class=\"hljs-attr\">script:<\/span> <span class=\"hljs-string\">|<\/span>\n          <span class=\"hljs-string\">sudo<\/span> <span class=\"hljs-string\">\/opt\/hooks\/reload-nginx.sh<\/span><\/code><\/pre>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u91cd\u8f7d Nginx \/ Apache \u7684\u547d\u4ee4\u9700\u8981 root \u6743\u9650\u624d\u80fd\u6267\u884c\uff0c\u53ef\u4ee5\u91c7\u7528\u53ea\u5141\u8bb8\u90e8\u7f72\u7528\u6237\u4ee5 root \u6743\u9650\u6267\u884c\u91cd\u8f7d\u811a\u672c\u7684\u65b9\u5f0f\u6765\u907f\u514d\u51fa\u73b0\u5b89\u5168\u95ee\u9898\u3002<\/p>\n<p>\u5728\u00a0<code>\/opt\/hooks<\/code>\u00a0\u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a\u6587\u4ef6\u00a0<code>reload-nginx.sh<\/code>\uff0c\u5185\u5bb9\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"hljs bash\"><span class=\"hljs-meta\">#!\/bin\/bash<\/span>\nsudo systemctl force-reload nginx<\/code><\/pre>\n<p>\u7136\u540e\u65b0\u5efa\u4e00\u4e2a\u540d\u4e3a\u00a0<code>actions-cert<\/code>\u00a0\u7684\u7528\u6237\uff0c\u7136\u540e\u5728\u00a0<code>\/etc\/sudoers<\/code>\u00a0\u6587\u4ef6\u4e2d\u6dfb\u52a0\u4ee5\u4e0b\u5185\u5bb9\uff1a<\/p>\n<pre><code class=\"hljs arcade\">actions-cert <span class=\"hljs-built_in\">ALL<\/span>=(<span class=\"hljs-built_in\">ALL<\/span>) NOPASSWD: <span class=\"hljs-regexp\">\/opt\/<\/span>hooks\/reload-nginx.sh<\/code><\/pre>\n<p>\u8fd9\u4e2a\u914d\u7f6e\u53ef\u4ee5\u4f7f\u00a0<code>actions-cert<\/code>\u00a0\u7528\u6237\u514d\u5bc6\u7801\u4ee5 root \u7528\u6237\u7684\u6743\u9650\u6267\u884c\u00a0<code>\/opt\/hooks\/reload-nginx.sh<\/code>\u3002<\/p>\n<p>\u6700\u540e\u4f7f\u7528\u00a0<code>chmod 755 \/opt\/hooks\/reload-nginx.sh<\/code>\u00a0\u547d\u4ee4\u5c06\u00a0<code>reload-nginx.sh<\/code>\u00a0\u6587\u4ef6\u8bbe\u7f6e\u4e3a\u53ef\u6267\u884c\uff0c\u540c\u65f6\u7981\u6b62\u975e\u6240\u6709\u8005\u5bf9\u5176\u8fdb\u884c\u5199\u5165\u64cd\u4f5c\u3002<\/p>\n<p>\u5982\u679c\u670d\u52a1\u5668\u4f4d\u4e8e NAT \u540e\uff0c\u6216\u8005\u7981\u6b62\u4e86 SSH \u8fde\u63a5\uff0c\u8fd8\u6709\u4e24\u4e2a\u65b9\u6cd5\u53ef\u4ee5\u5c06\u8bc1\u4e66\u90e8\u7f72\u5230\u5185\u7f51\u670d\u52a1\u5668\u4e0a\uff1a<\/p>\n<ol>\n<li>\u5c06\u8bc1\u4e66\u5148\u90e8\u7f72\u5230\u6709\u90e8\u7f72\u6761\u4ef6\u7684\u670d\u52a1\u5668\u4e0a\uff0c\u7136\u540e\u518d\u5728\u5185\u7f51\u670d\u52a1\u5668\u4e0a\u4f7f\u7528 rsync \u4ece\u90e8\u7f72\u597d\u7684\u670d\u52a1\u5668\u4e0a\u62c9\u53d6\u8bc1\u4e66\u3002<\/li>\n<li>\u5c06\u8bc1\u4e66\u4e0a\u4f20\u5230\u00a0<a href=\"https:\/\/azure.microsoft.com\/en-us\/services\/key-vault\/\" rel=\"external nofollow noreferrer\">Azure Key Vault<\/a>\u00a0\u7b49\u6258\u7ba1\u670d\u52a1\u4e2d\uff0c\u518d\u5728\u670d\u52a1\u5668\u4e0a\u6309\u7167\u00a0<a href=\"https:\/\/blog.men.ci\/ssl-with-github-actions\/#%E6%9C%8D%E5%8A%A1%E5%99%A8\" rel=\"external nofollow noreferrer\">Menci \u7684\u6587\u7ae0<\/a>\u00a0\u4e2d\u7684\u6559\u7a0b\u62c9\u53d6\u5373\u53ef\u3002<\/li>\n<\/ol>\n<h3 id=\"\u963f\u91cc\u4e91\">\u963f\u91cc\u4e91<\/h3>\n<p>\u963f\u91cc\u4e91\u7684\u00a0<a href=\"https:\/\/www.aliyun.com\/product\/cas\" rel=\"external nofollow noreferrer\">SSL \u8bc1\u4e66\u670d\u52a1<\/a>\u00a0\u652f\u6301\u4e0a\u4f20\u81ea\u5b9a\u4e49\u8bc1\u4e66\uff0c\u8be5\u8bc1\u4e66\u53ef\u4ee5\u7528\u4e8e\u00a0\u963f\u91cc\u4e91 CDN\u3002\u963f\u91cc\u4e91\u6682\u672a\u63d0\u4f9b\u5c06\u8bc1\u4e66\u90e8\u7f72\u81f3 OSS \u7684 API\uff0c\u5efa\u8bae OSS \u7528\u6237\u4f7f\u7528 CDN \u56de\u6e90 OSS \u6765\u4ee3\u66ff\u3002<\/p>\n<p>\u4f7f\u7528\u00a0<a href=\"https:\/\/github.com\/Menci\/deploy-certificate-to-aliyun\" rel=\"external nofollow noreferrer\">Menci\/deploy-certificate-to-aliyun<\/a>\u00a0\u5c06\u8bc1\u4e66\u90e8\u7f72\u5230\u963f\u91cc\u4e91\uff1a<\/p>\n<pre><code class=\"hljs yaml\"><span class=\"hljs-comment\"># \u90e8\u7f72\u5230\u963f\u91cc\u4e91<\/span>\n<span class=\"hljs-attr\">deploy-to-server:<\/span>\n  <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Deploy<\/span> <span class=\"hljs-string\">Certificate<\/span> <span class=\"hljs-string\">to<\/span> <span class=\"hljs-string\">Aliyun<\/span>\n  <span class=\"hljs-attr\">runs-on:<\/span> <span class=\"hljs-string\">ubuntu-latest<\/span>\n  <span class=\"hljs-attr\">needs:<\/span> <span class=\"hljs-string\">issue-ssl-certificate<\/span>\n\n  <span class=\"hljs-attr\">steps:<\/span>\n    <span class=\"hljs-comment\"># \u62c9\u53d6\u8bc1\u4e66\u5b58\u50a8\u5206\u652f<\/span>\n    <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Checkout<\/span>\n      <span class=\"hljs-attr\">uses:<\/span> <span class=\"hljs-string\">actions\/checkout@v2<\/span>\n      <span class=\"hljs-attr\">with:<\/span>\n        <span class=\"hljs-attr\">ref:<\/span> <span class=\"hljs-string\">certs<\/span>\n\n    <span class=\"hljs-comment\"># \u4e0a\u4f20\u8bc1\u4e66<\/span>\n    <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Deploy<\/span> <span class=\"hljs-string\">certificate<\/span> <span class=\"hljs-string\">to<\/span> <span class=\"hljs-string\">aliyun<\/span>\n      <span class=\"hljs-attr\">uses:<\/span> <span class=\"hljs-string\">Menci\/deploy-certificate-to-aliyun@beta-v1<\/span>\n      <span class=\"hljs-attr\">with:<\/span>\n        <span class=\"hljs-attr\">access-key-id:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">secrets.ALIYUN_ACCESS_KEY_ID<\/span> <span class=\"hljs-string\">}}<\/span>\n        <span class=\"hljs-attr\">access-key-secret:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">secrets.ALIYUN_ACCESS_KEY_SECRET<\/span> <span class=\"hljs-string\">}}<\/span>\n        <span class=\"hljs-attr\">fullchain-file:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">env.CERTS_OUTPUT_DIRECTORY<\/span> <span class=\"hljs-string\">}}\/${{<\/span> <span class=\"hljs-string\">env.FILE_FULLCHAIN<\/span> <span class=\"hljs-string\">}}<\/span>\n        <span class=\"hljs-attr\">key-file:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">env.CERTS_OUTPUT_DIRECTORY<\/span> <span class=\"hljs-string\">}}\/${{<\/span> <span class=\"hljs-string\">env.FILE_KEY<\/span> <span class=\"hljs-string\">}}<\/span>\n        <span class=\"hljs-attr\">certificate-name:<\/span> <span class=\"hljs-string\">example.com<\/span>\n        <span class=\"hljs-attr\">cdn-domains:<\/span> <span class=\"hljs-string\">|<\/span>\n<span class=\"hljs-string\">          example.com<\/span>\n<span class=\"hljs-string\">          example.net<\/span><\/code><\/pre>\n<p>\u5176\u4e2d\u00a0<code>certificate-name<\/code>\u00a0\u6307\u5b9a\u4e0a\u4f20\u7684\u8bc1\u4e66\u5728\u8bc1\u4e66\u670d\u52a1\u4e2d\u7684\u540d\u79f0\uff08\u5c06\u81ea\u52a8\u66ff\u6362\u65e7\u7248\u672c\uff09\uff0c<code>cdn-domain<\/code>\u00a0\u6307\u5b9a\u9700\u8981\u5c06\u8be5\u8bc1\u4e66\u90e8\u7f72\u5230\u7684 CDN \u57df\u540d\u5217\u8868\uff08\u7528\u7a7a\u767d\u5b57\u7b26\u9694\u5f00\uff09\u3002<\/p>\n<p>\u5efa\u8bae\u4f7f\u7528\u5b50\u8d26\u6237 Access Key\uff0c\u4e3a\u5176\u8d4b\u4e88\u4ee5\u4e0b\u6743\u9650\uff08\u5e76\u6309\u9700\u4f7f\u7528\u8d44\u6e90\u7ec4\u9694\u79bb\uff09\uff1a<\/p>\n<ul>\n<li>AliyunYundunCertFullAccess<\/li>\n<li>AliyunCDNFullAccess<\/li>\n<li>AliyunPCDNFullAccess<\/li>\n<li>AliyunSCDNFullAccess<\/li>\n<li>AliyunDCDNFullAccess<\/li>\n<\/ul>\n<h2 id=\"\u5b8c\u6574\u4f8b\u5b50\">\u5b8c\u6574\u4f8b\u5b50<\/h2>\n<p>\u8fd9\u4e2a Action \u5b8c\u6210\u4e86\u4ee5\u4e0b\u64cd\u4f5c\uff1a<\/p>\n<ol>\n<li>\u7533\u8bf7\u8bc1\u4e66\uff0c\u5e76\u4e0a\u4f20\u5230\u4ed3\u5e93\u7684\u00a0<code>certs<\/code>\u00a0\u5206\u652f\u3002<\/li>\n<li>\u5728\u7533\u8bf7\u8bc1\u4e66\u540e\u5c06\u00a0<code>certs<\/code>\u00a0\u5206\u652f\u4e2d\u7684\u8bc1\u4e66\u90e8\u7f72\u5230\u670d\u52a1\u5668\u4e0a\u3002<\/li>\n<\/ol>\n<pre><code class=\"hljs yaml\"><span class=\"hljs-comment\"># \u540d\u79f0<\/span>\n<span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Issue<\/span> <span class=\"hljs-string\">SSL<\/span> <span class=\"hljs-string\">Certificates<\/span>\n\n<span class=\"hljs-comment\"># \u89e6\u53d1\u6761\u4ef6<\/span>\n<span class=\"hljs-attr\">on:<\/span>\n  <span class=\"hljs-comment\"># \u624b\u52a8\u8fd0\u884c<\/span>\n  <span class=\"hljs-attr\">workflow_dispatch:<\/span>\n  <span class=\"hljs-comment\"># \u5b9a\u65f6\u8fd0\u884c<\/span>\n  <span class=\"hljs-attr\">schedule:<\/span>\n    <span class=\"hljs-comment\"># \u6bcf\u4e24\u4e2a\u6708\u8fd0\u884c\u4e00\u6b21<\/span>\n    <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">cron:<\/span> <span class=\"hljs-string\">'0 0 1 *\/2 *'<\/span>\n\n<span class=\"hljs-comment\"># \u5168\u5c40\u73af\u5883\u53d8\u91cf<\/span>\n<span class=\"hljs-attr\">env:<\/span>\n  <span class=\"hljs-comment\"># Checkout \u5230\u7684\u76ee\u5f55<\/span>\n  <span class=\"hljs-attr\">CERTS_OUTPUT_BASE:<\/span> <span class=\"hljs-string\">certs<\/span>\n  <span class=\"hljs-comment\"># \u8bc1\u4e66\u8f93\u51fa\u76ee\u5f55<\/span>\n  <span class=\"hljs-attr\">CERTS_OUTPUT_DIRECTORY:<\/span> <span class=\"hljs-string\">example.com<\/span>\n  <span class=\"hljs-comment\"># \u8bc1\u4e66\u6587\u4ef6\u540d<\/span>\n  <span class=\"hljs-attr\">FILE_FULLCHAIN:<\/span> <span class=\"hljs-string\">fullchain.pem<\/span>\n  <span class=\"hljs-comment\"># \u79c1\u94a5\u6587\u4ef6\u540d<\/span>\n  <span class=\"hljs-attr\">FILE_KEY:<\/span> <span class=\"hljs-string\">privatekey.key<\/span>\n\n<span class=\"hljs-attr\">jobs:<\/span>\n  <span class=\"hljs-attr\">issue-ssl-certificate:<\/span>\n    <span class=\"hljs-comment\"># \u7533\u8bf7\u8bc1\u4e66\u5e76 push \u5230 certs \u5206\u652f<\/span>\n    <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Issue<\/span> <span class=\"hljs-string\">SSL<\/span> <span class=\"hljs-string\">certificate<\/span>\n    <span class=\"hljs-attr\">runs-on:<\/span> <span class=\"hljs-string\">ubuntu-latest<\/span>\n    <span class=\"hljs-attr\">steps:<\/span>\n      <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Checkout<\/span>\n        <span class=\"hljs-attr\">uses:<\/span> <span class=\"hljs-string\">actions\/checkout@v2<\/span>\n        <span class=\"hljs-attr\">with:<\/span>\n          <span class=\"hljs-attr\">ref:<\/span> <span class=\"hljs-string\">master<\/span>\n\n      <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Checkout<\/span> <span class=\"hljs-string\">output<\/span> <span class=\"hljs-string\">branch<\/span>\n        <span class=\"hljs-attr\">uses:<\/span> <span class=\"hljs-string\">actions\/checkout@v2<\/span>\n        <span class=\"hljs-attr\">with:<\/span>\n          <span class=\"hljs-attr\">ref:<\/span> <span class=\"hljs-string\">certs<\/span>\n          <span class=\"hljs-attr\">path:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">env.CERTS_OUTPUT_BASE<\/span> <span class=\"hljs-string\">}}<\/span>\n\n      <span class=\"hljs-comment\"># \u5b89\u88c5 acme.sh<\/span>\n      <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Install<\/span> <span class=\"hljs-string\">acme.sh<\/span>\n        <span class=\"hljs-attr\">shell:<\/span> <span class=\"hljs-string\">bash<\/span>\n        <span class=\"hljs-attr\">run:<\/span> <span class=\"hljs-string\">curl<\/span> <span class=\"hljs-string\">-s<\/span> <span class=\"hljs-string\">https:\/\/get.acme.sh<\/span> <span class=\"hljs-string\">|<\/span> <span class=\"hljs-string\">sh<\/span>\n\n      <span class=\"hljs-comment\"># \u89e3\u538b acme.sh \u914d\u7f6e\u4fe1\u606f<\/span>\n      <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Extract<\/span> <span class=\"hljs-string\">account<\/span> <span class=\"hljs-string\">files<\/span> <span class=\"hljs-string\">for<\/span> <span class=\"hljs-string\">acme.sh<\/span>\n        <span class=\"hljs-attr\">shell:<\/span> <span class=\"hljs-string\">bash<\/span>\n        <span class=\"hljs-attr\">run:<\/span> <span class=\"hljs-string\">|<\/span>\n<span class=\"hljs-string\">          echo \"$ACME_SH_ACCOUNT_TAR\" | base64 -d | tar -C ~\/.acme.sh -xz<\/span>\n        <span class=\"hljs-attr\">env:<\/span>\n          <span class=\"hljs-comment\"># Base64 \u7f16\u7801\u7684 acme.sh \u914d\u7f6e\u4fe1\u606f<\/span>\n          <span class=\"hljs-attr\">ACME_SH_ACCOUNT_TAR:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">secrets.ACME_SH_ACCOUNT_TAR<\/span> <span class=\"hljs-string\">}}<\/span>\n\n      <span class=\"hljs-comment\"># \u7533\u8bf7\u8bc1\u4e66<\/span>\n      <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Issue<\/span> <span class=\"hljs-string\">SSL<\/span> <span class=\"hljs-string\">certificates<\/span>\n        <span class=\"hljs-attr\">shell:<\/span> <span class=\"hljs-string\">bash<\/span>\n        <span class=\"hljs-attr\">run:<\/span> <span class=\"hljs-string\">|<\/span>\n<span class=\"hljs-string\">          ~\/.acme.sh\/acme.sh --issue            \\<\/span>\n<span class=\"hljs-string\">            -d \"example.com\" -d \"*.example.com\" \\<\/span>\n<span class=\"hljs-string\">            --dns dns_cf --server letsencrypt<\/span>\n\n      <span class=\"hljs-comment\"># \u5bfc\u51fa\u8bc1\u4e66<\/span>\n      <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Copy<\/span> <span class=\"hljs-string\">certificate<\/span> <span class=\"hljs-string\">to<\/span> <span class=\"hljs-string\">output<\/span> <span class=\"hljs-string\">paths<\/span>\n        <span class=\"hljs-attr\">shell:<\/span> <span class=\"hljs-string\">bash<\/span>\n        <span class=\"hljs-attr\">run:<\/span> <span class=\"hljs-string\">|<\/span>\n<span class=\"hljs-string\">          ACME_SH_TEMP_DIR=\"$(mktemp -d)\"<\/span>\n<span class=\"hljs-string\">          ACME_SH_TEMP_FILE_FULLCHAIN=\"$ACME_SH_TEMP_DIR\/fullchain.pem\"<\/span>\n<span class=\"hljs-string\">          ACME_SH_TEMP_FILE_KEY=\"$ACME_SH_TEMP_DIR\/key.pem\"<\/span>\n\n          <span class=\"hljs-comment\"># \u4e0d\u8981\u5fd8\u8bb0\u4fee\u6539\u8fd9\u91cc\u7684 -d \u53c2\u6570\u503c\u4e3a\u4e0a\u65b9\u7684\u7b2c\u4e00\u4e2a\u57df\u540d<\/span>\n          <span class=\"hljs-string\">~\/.acme.sh\/acme.sh<\/span> <span class=\"hljs-string\">--install-cert<\/span> <span class=\"hljs-string\">-d<\/span> <span class=\"hljs-string\">\"example.com\"<\/span> <span class=\"hljs-string\">--fullchain-file<\/span> <span class=\"hljs-string\">\"$ACME_SH_TEMP_FILE_FULLCHAIN\"<\/span> <span class=\"hljs-string\">--key-file<\/span> <span class=\"hljs-string\">\"$ACME_SH_TEMP_FILE_KEY\"<\/span>\n\n          [[ <span class=\"hljs-string\">-z<\/span> <span class=\"hljs-string\">\"$ACME_SH_OUTPUT_FULLCHAIN\"<\/span> ]] <span class=\"hljs-string\">||<\/span> <span class=\"hljs-string\">(mkdir<\/span> <span class=\"hljs-string\">-p<\/span> <span class=\"hljs-string\">\"$(dirname \"<\/span><span class=\"hljs-string\">$ACME_SH_OUTPUT_FULLCHAIN\")\"<\/span> <span class=\"hljs-string\">&amp;&amp;<\/span> <span class=\"hljs-string\">cp<\/span> <span class=\"hljs-string\">\"$ACME_SH_TEMP_FILE_FULLCHAIN\"<\/span> <span class=\"hljs-string\">\"$ACME_SH_OUTPUT_FULLCHAIN\"<\/span><span class=\"hljs-string\">)<\/span>\n          [[ <span class=\"hljs-string\">-z<\/span> <span class=\"hljs-string\">\"$ACME_SH_OUTPUT_KEY\"<\/span> ]] <span class=\"hljs-string\">||<\/span> <span class=\"hljs-string\">(mkdir<\/span> <span class=\"hljs-string\">-p<\/span> <span class=\"hljs-string\">\"$(dirname \"<\/span><span class=\"hljs-string\">$ACME_SH_OUTPUT_KEY\")\"<\/span> <span class=\"hljs-string\">&amp;&amp;<\/span> <span class=\"hljs-string\">cp<\/span> <span class=\"hljs-string\">\"$ACME_SH_TEMP_FILE_KEY\"<\/span> <span class=\"hljs-string\">\"$ACME_SH_OUTPUT_KEY\"<\/span><span class=\"hljs-string\">)<\/span>\n\n          <span class=\"hljs-string\">rm<\/span> <span class=\"hljs-string\">-rf<\/span> <span class=\"hljs-string\">\"$ACME_SH_TEMP_DIR\"<\/span>\n        <span class=\"hljs-attr\">env:<\/span>\n          <span class=\"hljs-attr\">ACME_SH_OUTPUT_FULLCHAIN:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">env.CERTS_OUTPUT_BASE<\/span> <span class=\"hljs-string\">}}\/${{<\/span> <span class=\"hljs-string\">env.CERTS_OUTPUT_DIRECTORY<\/span> <span class=\"hljs-string\">}}\/${{<\/span> <span class=\"hljs-string\">env.FILE_FULLCHAIN<\/span> <span class=\"hljs-string\">}}<\/span>\n          <span class=\"hljs-attr\">ACME_SH_OUTPUT_KEY:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">env.CERTS_OUTPUT_BASE<\/span> <span class=\"hljs-string\">}}\/${{<\/span> <span class=\"hljs-string\">env.CERTS_OUTPUT_DIRECTORY<\/span> <span class=\"hljs-string\">}}\/${{<\/span> <span class=\"hljs-string\">env.FILE_KEY<\/span> <span class=\"hljs-string\">}}<\/span>\n\n      <span class=\"hljs-comment\"># \u4e0a\u4f20\u8bc1\u4e66<\/span>\n      <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Push<\/span> <span class=\"hljs-string\">to<\/span> <span class=\"hljs-string\">GitHub<\/span>\n        <span class=\"hljs-attr\">run:<\/span> <span class=\"hljs-string\">|<\/span>\n<span class=\"hljs-string\">          git config --global user.name \"BaoshuoBot\"<\/span>\n<span class=\"hljs-string\">          git config --global user.email \"79077260+BaoshuoBot@users.noreply.github.com\"<\/span>\n\n          <span class=\"hljs-string\">cd<\/span> <span class=\"hljs-string\">\"$CERTS_DIRECTORY\"<\/span>\n\n          <span class=\"hljs-string\">git<\/span> <span class=\"hljs-string\">add<\/span> <span class=\"hljs-string\">\"$FILE_FULLCHAIN\"<\/span> <span class=\"hljs-string\">\"$FILE_KEY\"<\/span>\n          <span class=\"hljs-string\">git<\/span> <span class=\"hljs-string\">commit<\/span> <span class=\"hljs-string\">-m<\/span> <span class=\"hljs-string\">\"Upload certificates on $(date '+%Y-%m-%d %H:%M:%S')\"<\/span>\n          <span class=\"hljs-string\">git<\/span> <span class=\"hljs-string\">push<\/span>\n        <span class=\"hljs-attr\">env:<\/span>\n          <span class=\"hljs-attr\">TZ:<\/span> <span class=\"hljs-string\">Asia\/Shanghai<\/span>\n          <span class=\"hljs-attr\">CERTS_DIRECTORY:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">env.CERTS_OUTPUT_BASE<\/span> <span class=\"hljs-string\">}}\/${{<\/span> <span class=\"hljs-string\">env.CERTS_OUTPUT_DIRECTORY<\/span> <span class=\"hljs-string\">}}<\/span>\n\n  <span class=\"hljs-comment\"># \u90e8\u7f72\u8bc1\u4e66\u5230\u670d\u52a1\u5668<\/span>\n  <span class=\"hljs-attr\">deploy-to-server:<\/span>\n    <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Deploy<\/span> <span class=\"hljs-string\">Certificate<\/span> <span class=\"hljs-string\">to<\/span> <span class=\"hljs-string\">Server<\/span>\n    <span class=\"hljs-attr\">runs-on:<\/span> <span class=\"hljs-string\">ubuntu-latest<\/span>\n    <span class=\"hljs-attr\">needs:<\/span> <span class=\"hljs-string\">issue-ssl-certificate<\/span>\n\n    <span class=\"hljs-attr\">strategy:<\/span>\n      <span class=\"hljs-attr\">matrix:<\/span>\n        <span class=\"hljs-attr\">host:<\/span>\n          <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-number\">174.136<\/span><span class=\"hljs-number\">.239<\/span><span class=\"hljs-number\">.1<\/span> <span class=\"hljs-comment\"># Server 1<\/span>\n          <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-number\">174.136<\/span><span class=\"hljs-number\">.239<\/span><span class=\"hljs-number\">.2<\/span> <span class=\"hljs-comment\"># Server 2<\/span>\n          <span class=\"hljs-comment\"># ...<\/span>\n          <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-number\">174.136<\/span><span class=\"hljs-number\">.239<\/span><span class=\"hljs-number\">.254<\/span> <span class=\"hljs-comment\"># Server N<\/span>\n\n    <span class=\"hljs-attr\">steps:<\/span>\n      <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Checkout<\/span>\n        <span class=\"hljs-attr\">uses:<\/span> <span class=\"hljs-string\">actions\/checkout@v2<\/span>\n        <span class=\"hljs-attr\">with:<\/span>\n          <span class=\"hljs-attr\">ref:<\/span> <span class=\"hljs-string\">certs<\/span>\n\n      <span class=\"hljs-comment\"># \u4e0a\u4f20\u8bc1\u4e66<\/span>\n      <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Upload<\/span> <span class=\"hljs-string\">certificate<\/span> <span class=\"hljs-string\">to<\/span> <span class=\"hljs-string\">server<\/span>\n        <span class=\"hljs-attr\">uses:<\/span> <span class=\"hljs-string\">easingthemes\/ssh-deploy@v2.1.5<\/span>\n        <span class=\"hljs-attr\">env:<\/span>\n          <span class=\"hljs-attr\">SSH_PRIVATE_KEY:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">secrets.SSH_PRIVATE_KEY<\/span> <span class=\"hljs-string\">}}<\/span>\n          <span class=\"hljs-attr\">ARGS:<\/span> <span class=\"hljs-string\">'-avz --delete'<\/span>\n          <span class=\"hljs-attr\">REMOTE_HOST:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">matrix.host<\/span> <span class=\"hljs-string\">}}<\/span>\n          <span class=\"hljs-attr\">REMOTE_USER:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">secrets.REMOTE_USER<\/span> <span class=\"hljs-string\">}}<\/span>\n          <span class=\"hljs-attr\">SOURCE:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">env.CERTS_OUTPUT_DIRECTORY<\/span> <span class=\"hljs-string\">}}\/<\/span>\n          <span class=\"hljs-attr\">TARGET:<\/span> <span class=\"hljs-string\">\/path\/to\/ssl\/certs\/${{<\/span> <span class=\"hljs-string\">env.CERTS_OUTPUT_DIRECTORY<\/span> <span class=\"hljs-string\">}}\/<\/span>\n\n      <span class=\"hljs-comment\"># \u91cd\u8f7d Nginx<\/span>\n      <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Force-reload<\/span> <span class=\"hljs-string\">nginx<\/span>\n        <span class=\"hljs-attr\">uses:<\/span> <span class=\"hljs-string\">appleboy\/ssh-action@v0.1.4<\/span>\n        <span class=\"hljs-attr\">with:<\/span>\n          <span class=\"hljs-attr\">host:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">matrix.host<\/span> <span class=\"hljs-string\">}}<\/span>\n          <span class=\"hljs-attr\">username:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">secrets.REMOTE_USER<\/span> <span class=\"hljs-string\">}}<\/span>\n          <span class=\"hljs-attr\">key:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">secrets.SSH_PRIVATE_KEY<\/span> <span class=\"hljs-string\">}}<\/span>\n          <span class=\"hljs-attr\">script:<\/span> <span class=\"hljs-string\">|<\/span>\n            <span class=\"hljs-string\">sudo<\/span> <span class=\"hljs-string\">\/opt\/hooks\/reload-nginx.sh<\/span><\/code><\/pre>\n<h2 id=\"\u6742\u9879\">\u6742\u9879<\/h2>\n<p>\u90e8\u5206\u60c5\u51b5\u4e0b\uff0cGitHub Actions \u4e2d\u7684\u00a0<code>GITHUB_TOKEN<\/code>\u00a0\u53ea\u6709 Read repository contents permission\uff0c\u800c\u672c\u6587\u4e2d\u7684 Actions \u8981\u6c42\u8fd9\u4e2a Token \u5177\u6709 Read and write permissions\uff0c\u90a3\u4e48\u9700\u8981\u5728\u4ed3\u5e93\u7684 Settings &gt; Actions &gt; General \u9875\u9762\u7684\u5e95\u90e8\u8d4b\u4e88\u5176\u5199\u5165\u6743\u9650\uff0c\u5982\u56fe\u6240\u793a\uff1a<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1069\" title=\"WA5tTau3mnBLIqZ\" src=\"https:\/\/oimi.me\/wp-content\/uploads\/2022\/05\/WA5tTau3mnBLIqZ.png\" alt=\"WA5tTau3mnBLIqZ\" width=\"1030\" height=\"466\" \/><\/p>\n<p>\u8bbe\u7f6e\u597d\u540e\u70b9\u51fb Save \u6309\u94ae\u5373\u53ef\u3002<\/p>\n<ol>\n<li><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>\u5bf9\u4e8e\u4e00\u4e2a\u6709\u5f88\u591a\u670d\u52a1\u5668\u7684\u4eba\u6765\u8bf4\uff0c\u5728\u4e0d\u540c\u670d\u52a1\u5668\u4e0a\u540c\u6b65 SSL \u8bc1\u4e66\u662f\u4e00\u4ef6\u9ebb\u70e6\u4e8b\u3002\u7b14\u8005\u5c1d\u8bd5\u8fc7\u5f88\u591a\u79cd\u65b9\u5f0f\uff0c\u6700\u540e\u5728\u00a0Me [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":1069,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"image","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-1068","post","type-post","status-publish","format-image","has-post-thumbnail","hentry","category-lab","post_format-post-format-image"],"_links":{"self":[{"href":"https:\/\/myya.net\/index.php\/wp-json\/wp\/v2\/posts\/1068","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/myya.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/myya.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/myya.net\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/myya.net\/index.php\/wp-json\/wp\/v2\/comments?post=1068"}],"version-history":[{"count":0,"href":"https:\/\/myya.net\/index.php\/wp-json\/wp\/v2\/posts\/1068\/revisions"}],"wp:attachment":[{"href":"https:\/\/myya.net\/index.php\/wp-json\/wp\/v2\/media?parent=1068"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/myya.net\/index.php\/wp-json\/wp\/v2\/categories?post=1068"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/myya.net\/index.php\/wp-json\/wp\/v2\/tags?post=1068"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}