<!DOCTYPE html>
< html lang = "" >
< head >
< title > Centos7下 Nginx 配置ssl证书自动续期 - EEE.DOG< / title > < meta charset = "UTF-8" / >
< meta http-equiv = "X-UA-Compatible" content = "IE=edge" / >
< meta name = "viewport" content = "width=device-width, initial-scale=1, maximum-scale=1" / >
< meta http-equiv = "Cache-Control" content = "no-transform" / >
< meta http-equiv = "Cache-Control" content = "no-siteapp" / >
< meta name = "theme-color" content = "#f8f5ec" / >
< meta name = "msapplication-navbutton-color" content = "#f8f5ec" >
< meta name = "apple-mobile-web-app-capable" content = "yes" >
< meta name = "apple-mobile-web-app-status-bar-style" content = "#f8f5ec" >
< meta name = "description" content = "Centos7下 Nginx 配置ssl证书自动续期" / > < meta name = "keywords" content = "iotcat,yimian,blog" / > < link rel = "alternate" href = "/atom.xml" title = "EEE.DOG" > < link rel = "shortcut icon" type = "image/x-icon" href = "/favicon.ico?v=1.0.0" / > < script > lang = [ 'zh' , 'en' ] ; < / script >
< script type = "text/javascript" src = "https://cdn.yimian.xyz/ushio-js/ushio-head.min.js" > < / script >
< script > page . proj = 'iotcat/eee.dog-public' ; < / script >
<!-- <link rel="stylesheet" type="text/css" href="https://cdn.yimian.xyz/kayo/lib/iziModal/iziModal.min.css" /> -->
<!-- <link rel="stylesheet" type="text/css" href="https://cdn.yimian.xyz/kayo/lib/iziToast/iziToast.min.css" /> -->
< link rel = "stylesheet" media = "none" onload = "this.media='all'" type = "text/css" href = "https://cdn.yimian.xyz/shaky/shaky.css" >
< link rel = "canonical" href = "https://www.eee.dog/tech/ssl-auto-apply.html" / >
< link rel = "stylesheet" media = "none" onload = "this.media='all'" type = "text/css" href = "https://cdn.yimian.xyz/kayo/lib/fancybox/jquery.fancybox.css" / > < script type = "text/x-mathjax-config" >
MathJax.Hub.Config({ tex2jax: { inlineMath: [['$','$'], ['\\(','\\)']] } });
< / script >
< script type = "text/javascript" async src = "https://cdn.yimian.xyz/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML" > < / script >
< link rel = "stylesheet" type = "text/css" href = "https://cdn.yimian.xyz/kayo/css/style.css?v=1.0.0" / >
<!-- Global site tag (gtag.js) - Google Analytics -->
< script async src = "https://www.googletagmanager.com/gtag/js?id=UA-169276192-1" data-pjax > < / script >
< script >
pjax_google_analytics = () => {
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-169276192-1');
}
< / script > < script id = "baidu_push" >
(function(){
var bp = document.createElement('script');
var curProtocol = window.location.protocol.split(':')[0];
if (curProtocol === 'https') {
bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
}
else {
bp.src = 'http://push.zhanzhang.baidu.com/push.js';
}
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(bp, s);
})();
< / script >
< script >
window.config = {"leancloud":"","toc":true,"fancybox":true,"pjax":{"enable":true,"loadingbar":true},"latex":true};
< / script >
< meta name = "generator" content = "Hexo 4.2.1" > < link rel = "alternate" href = "/atom.xml" title = "EEE.DOG" type = "application/atom+xml" >
< / head >
< body > < div id = "mobile-navbar" class = "mobile-navbar" >
< div class = "mobile-header-logo" >
< a href = "/." class = "logo" > EEE.DOG< / a >
< / div >
< div class = "mobile-navbar-icon" >
< span > < / span >
< span > < / span >
< span > < / span >
< / div >
< div class = "loading-bar" >
< div class = "progress" > < / div >
< / div >
< / div >
< nav id = "mobile-menu" class = "mobile-menu slideout-menu" >
< ul class = "mobile-menu-list" > < div id = "mobile-menu-Home" >
< a href = "/" >
< li class = "mobile-menu-item" > < span class = ".en" > Home< / span > < span class = ".zh" > 主页< / span >
< / li >
< / a > < / div > < div id = "mobile-menu-Archives" >
< a href = "/archives/" >
< li class = "mobile-menu-item" > < span class = ".en" > Archives< / span > < span class = ".zh" > 归档< / span >
< / li >
< / a > < / div > < div id = "mobile-menu-Categories" >
< a href = "/categories/" >
< li class = "mobile-menu-item" > < span class = ".en" > Categories< / span > < span class = ".zh" > 分类< / span >
< / li >
< / a > < / div > < div id = "mobile-menu-Projects" >
< a href = "#" >
< li class = "mobile-menu-item" > < span class = ".en" > Projects< / span > < span class = ".zh" > 项目< / span >
< / li >
< / a > < ul class = "sub-menu" style = "display: none;" >
< li >
< a href = "https://fp.yimian.xyz/" target = "_blank" rel = "noopener" >
< span class = ".en" > fp< / span > < span class = ".zh" > fp< / span >
< / a >
< / li >
< li >
< a href = "https://wiot.yimian.xyz/" target = "_blank" rel = "noopener" >
< span class = ".en" > wiot< / span > < span class = ".zh" > wiot< / span >
< / a >
< / li >
< / ul >
< script > $ ( ' # m o b i l e - m e n u - P r o j e c t s ' ) . c l i c k ( f u n c t i o n ( ) {
$("#mobile-menu-Projects ul").toggle();
})< / script >
< / div > < div id = "mobile-menu-Map" >
< a href = "#" >
< li class = "mobile-menu-item" > < span class = ".en" > Map< / span > < span class = ".zh" > 导航< / span >
< / li >
< / a > < ul class = "sub-menu" style = "display: none;" >
< li >
< a href = "https://api.yimian.xyz/" target = "_blank" rel = "noopener" >
< span class = ".en" > APIs< / span > < span class = ".zh" > 接口< / span >
< / a >
< / li >
< li >
< a href = "https://img.yimian.xyz/" target = "_blank" rel = "noopener" >
< span class = ".en" > Imgs< / span > < span class = ".zh" > 图库< / span >
< / a >
< / li >
< li >
< a href = "/" >
< span class = ".en" > Imgbed< / span > < span class = ".zh" > 图床< / span >
< / a >
< / li >
< li >
< a href = "https://share.yimian.xyz/" target = "_blank" rel = "noopener" >
< span class = ".en" > Fileshare< / span > < span class = ".zh" > 文件分享< / span >
< / a >
< / li >
< li >
< a href = "https://monitor.yimian.xyz/" target = "_blank" rel = "noopener" >
< span class = ".en" > Monitor< / span > < span class = ".zh" > 监控< / span >
< / a >
< / li >
< li >
< a href = "https://acg.watch/" target = "_blank" rel = "noopener" >
< span class = ".en" > ACG.WATCH< / span > < span class = ".zh" > 视频< / span >
< / a >
< / li >
< li >
< a href = "https://onedrive.yimian.xyz/" target = "_blank" rel = "noopener" >
< span class = ".en" > Oneindex< / span > < span class = ".zh" > 网盘< / span >
< / a >
< / li >
< li >
< a href = "https://proxy.yimian.xyz/" target = "_blank" rel = "noopener" >
< span class = ".en" > Proxy< / span > < span class = ".zh" > 下载代理< / span >
< / a >
< / li >
< li >
< a href = "https://shorturl.yimian.xyz/" target = "_blank" rel = "noopener" >
< span class = ".en" > ShortenURL< / span > < span class = ".zh" > 短链< / span >
< / a >
< / li >
< / ul >
< script > $ ( ' # m o b i l e - m e n u - M a p ' ) . c l i c k ( f u n c t i o n ( ) {
$("#mobile-menu-Map ul").toggle();
})< / script >
< / div > < div id = "mobile-menu-About" >
< a href = "#" >
< li class = "mobile-menu-item" > < span class = ".en" > About< / span > < span class = ".zh" > 关于< / span >
< / li >
< / a > < ul class = "sub-menu" style = "display: none;" >
< li >
< a href = "/links/" >
< span class = ".en" > links< / span > < span class = ".zh" > 友链< / span >
< / a >
< / li >
< li >
< a href = "https://iotcat.me/" target = "_blank" rel = "noopener" >
< span class = ".en" > Me< / span > < span class = ".zh" > 关于我< / span >
< / a >
< / li >
< / ul >
< script > $ ( ' # m o b i l e - m e n u - A b o u t ' ) . c l i c k ( f u n c t i o n ( ) {
$("#mobile-menu-About ul").toggle();
})< / script >
< / div > < / ul >
< / nav >
< div class = "container" id = "mobile-panel" >
< header id = "header" class = "header" > < div class = "logo-wrapper" >
< a href = "/." class = "logo" > EEE.DOG< / a >
< / div >
< nav class = "site-navbar" > < ul id = "menu" class = "menu" > < li class = "menu-item" >
< a id = "menu-Home" class = "menu-item-link" href = "/" >
< span class = ".en" > Home< / span > < span class = ".zh" > 主页< / span >
< / a >
< / li >
< li class = "menu-item" >
< a id = "menu-Archives" class = "menu-item-link" href = "/archives/" >
< span class = ".en" > Archives< / span > < span class = ".zh" > 归档< / span >
< / a >
< / li >
< li class = "menu-item" >
< a id = "menu-Categories" class = "menu-item-link" href = "/categories/" >
< span class = ".en" > Categories< / span > < span class = ".zh" > 分类< / span >
< / a >
< / li >
< li class = "menu-item" >
< a id = "menu-Projects" class = "menu-item-link" href = "#" >
< span class = ".en" > Projects< / span > < span class = ".zh" > 项目< / span >
< / a >
< script >
$("#menu-Projects").click(function(){
tips.question({
timeout: 20000,
close: false,
overlay: true,
displayMode: 'once',
//id: 'question',
zindex: 999,
title: 'Projects',
message: '',
position: 'center',
buttons: [
['< button > < b > '+((page.tran.getLang() != 'zh')?'fp':'fp')+'< / b > < / button > ', function (instance, toast) {
instance.hide({ transitionOut: 'fadeOut' }, toast, 'button');
if("undefined" == "true")
pjax.loadUrl("https://fp.yimian.xyz/");
else
window.location.href="https://fp.yimian.xyz/";
}, true],
['< button > < b > '+((page.tran.getLang() != 'zh')?'wiot':'wiot')+'< / b > < / button > ', function (instance, toast) {
instance.hide({ transitionOut: 'fadeOut' }, toast, 'button');
if("undefined" == "true")
pjax.loadUrl("https://wiot.yimian.xyz/");
else
window.location.href="https://wiot.yimian.xyz/";
}, true],
['< button > < b > close< / b > < / button > ', function (instance, toast) {
instance.hide({ transitionOut: 'fadeOut' }, toast, 'button');
}, true],
]
});
});
< / script >
< / li >
< li class = "menu-item" >
< a id = "menu-Map" class = "menu-item-link" href = "#" >
< span class = ".en" > Map< / span > < span class = ".zh" > 导航< / span >
< / a >
< script >
$("#menu-Map").click(function(){
tips.question({
timeout: 20000,
close: false,
overlay: true,
displayMode: 'once',
//id: 'question',
zindex: 999,
title: 'Map',
message: '',
position: 'center',
buttons: [
['< button > < b > '+((page.tran.getLang() != 'zh')?'APIs':'接口')+'< / b > < / button > ', function (instance, toast) {
instance.hide({ transitionOut: 'fadeOut' }, toast, 'button');
if("undefined" == "true")
pjax.loadUrl("https://api.yimian.xyz/");
else
window.location.href="https://api.yimian.xyz/";
}, true],
['< button > < b > '+((page.tran.getLang() != 'zh')?'Imgs':'图库')+'< / b > < / button > ', function (instance, toast) {
instance.hide({ transitionOut: 'fadeOut' }, toast, 'button');
if("undefined" == "true")
pjax.loadUrl("https://img.yimian.xyz/");
else
window.location.href="https://img.yimian.xyz/";
}, true],
['< button > < b > '+((page.tran.getLang() != 'zh')?'Imgbed':'图床')+'< / b > < / button > ', function (instance, toast) {
instance.hide({ transitionOut: 'fadeOut' }, toast, 'button');
if("undefined" == "true")
pjax.loadUrl("/");
else
window.location.href="undefined";
}, true],
['< button > < b > '+((page.tran.getLang() != 'zh')?'Fileshare':'文件分享')+'< / b > < / button > ', function (instance, toast) {
instance.hide({ transitionOut: 'fadeOut' }, toast, 'button');
if("undefined" == "true")
pjax.loadUrl("https://share.yimian.xyz/");
else
window.location.href="https://share.yimian.xyz/";
}, true],
['< button > < b > '+((page.tran.getLang() != 'zh')?'Monitor':'监控')+'< / b > < / button > ', function (instance, toast) {
instance.hide({ transitionOut: 'fadeOut' }, toast, 'button');
if("undefined" == "true")
pjax.loadUrl("https://monitor.yimian.xyz/");
else
window.location.href="https://monitor.yimian.xyz/";
}, true],
['< button > < b > '+((page.tran.getLang() != 'zh')?'ACG.WATCH':'视频')+'< / b > < / button > ', function (instance, toast) {
instance.hide({ transitionOut: 'fadeOut' }, toast, 'button');
if("undefined" == "true")
pjax.loadUrl("https://acg.watch/");
else
window.location.href="https://acg.watch/";
}, true],
['< button > < b > '+((page.tran.getLang() != 'zh')?'Oneindex':'网盘')+'< / b > < / button > ', function (instance, toast) {
instance.hide({ transitionOut: 'fadeOut' }, toast, 'button');
if("undefined" == "true")
pjax.loadUrl("https://onedrive.yimian.xyz/");
else
window.location.href="https://onedrive.yimian.xyz/";
}, true],
['< button > < b > '+((page.tran.getLang() != 'zh')?'Proxy':'下载代理')+'< / b > < / button > ', function (instance, toast) {
instance.hide({ transitionOut: 'fadeOut' }, toast, 'button');
if("undefined" == "true")
pjax.loadUrl("https://proxy.yimian.xyz/");
else
window.location.href="https://proxy.yimian.xyz/";
}, true],
['< button > < b > '+((page.tran.getLang() != 'zh')?'ShortenURL':'短链')+'< / b > < / button > ', function (instance, toast) {
instance.hide({ transitionOut: 'fadeOut' }, toast, 'button');
if("undefined" == "true")
pjax.loadUrl("https://shorturl.yimian.xyz/");
else
window.location.href="https://shorturl.yimian.xyz/";
}, true],
['< button > < b > close< / b > < / button > ', function (instance, toast) {
instance.hide({ transitionOut: 'fadeOut' }, toast, 'button');
}, true],
]
});
});
< / script >
< / li >
< li class = "menu-item" >
< a id = "menu-About" class = "menu-item-link" href = "#" >
< span class = ".en" > About< / span > < span class = ".zh" > 关于< / span >
< / a >
< script >
$("#menu-About").click(function(){
tips.question({
timeout: 20000,
close: false,
overlay: true,
displayMode: 'once',
//id: 'question',
zindex: 999,
title: 'About',
message: '',
position: 'center',
buttons: [
['< button > < b > '+((page.tran.getLang() != 'zh')?'links':'友链')+'< / b > < / button > ', function (instance, toast) {
instance.hide({ transitionOut: 'fadeOut' }, toast, 'button');
if("true" == "true")
pjax.loadUrl("/links/");
else
window.location.href="/links/";
}, true],
['< button > < b > '+((page.tran.getLang() != 'zh')?'Me':'关于我')+'< / b > < / button > ', function (instance, toast) {
instance.hide({ transitionOut: 'fadeOut' }, toast, 'button');
if("undefined" == "true")
pjax.loadUrl("https://iotcat.me/");
else
window.location.href="https://iotcat.me/";
}, true],
['< button > < b > close< / b > < / button > ', function (instance, toast) {
instance.hide({ transitionOut: 'fadeOut' }, toast, 'button');
}, true],
]
});
});
< / script >
< / li >
< / ul > < / nav >
< / header >
< main id = "main" class = "main" >
< div class = "content-wrapper" >
< div id = "content" class = "content" > < article class = "post" >
< header class = "post-header" >
< h1 class = "post-title" > < span class = ".zh" > Centos7下 Nginx 配置ssl证书自动续期< / span > < span class = ".en" hidden > Nginx configure ssl certificate automatic renewal under Centos7< / span >
< / h1 >
< div class = "post-meta" >
< span class = "post-time" >
2019-03-09
< / span > < span class = "post-category" >
< a href = "/categories/tech/" > tech< / a >
< / span >
< / div >
< / header >
< style > . toc-level-2 > . toc-child { display : none !important ; } < / style >
< div class = "post-toc" id = "post-toc" >
< h2 class = "post-toc-title" > Contents< / h2 >
< div class = "post-toc-content" >
< ol class = "toc" > < li class = "toc-item toc-level-2" > < a class = "toc-link" href = "#前提条件" > < span class = "toc-text" > 前提条件< / span > < / a > < / li > < li class = "toc-item toc-level-2" > < a class = "toc-link" href = "#安装certbot" > < span class = "toc-text" > 安装certbot< / span > < / a > < / li > < li class = "toc-item toc-level-2" > < a class = "toc-link" href = "#初次申领证书" > < span class = "toc-text" > 初次申领证书< / span > < / a > < ol class = "toc-child" > < li class = "toc-item toc-level-3" > < a class = "toc-link" href = "#初次申领某域名证书" > < span class = "toc-text" > 初次申领某域名证书< / span > < / a > < / li > < li class = "toc-item toc-level-3" > < a class = "toc-link" href = "#证书位置" > < span class = "toc-text" > 证书位置< / span > < / a > < / li > < li class = "toc-item toc-level-3" > < a class = "toc-link" href = "#配置nginx" > < span class = "toc-text" > 配置nginx< / span > < / a > < / li > < / ol > < / li > < li class = "toc-item toc-level-2" > < a class = "toc-link" href = "#配置自动续期" > < span class = "toc-text" > 配置自动续期< / span > < / a > < / li > < li class = "toc-item toc-level-2" > < a class = "toc-link" href = "#Prerequisites" > < span class = "toc-text" > Prerequisites< / span > < / a > < / li > < li class = "toc-item toc-level-2" > < a class = "toc-link" href = "#Install-certbot" > < span class = "toc-text" > Install certbot< / span > < / a > < / li > < li class = "toc-item toc-level-2" > < a class = "toc-link" href = "#Initial-application-certificate" > < span class = "toc-text" > Initial application certificate< / span > < / a > < ol class = "toc-child" > < li class = "toc-item toc-level-3" > < a class = "toc-link" href = "#Apply-for-a-domain-name-certificate-for-the-first-time" > < span class = "toc-text" > Apply for a domain name certificate for the first time< / span > < / a > < / li > < li class = "toc-item toc-level-3" > < a class = "toc-link" href = "#Certificate-location" > < span class = "toc-text" > Certificate location< / span > < / a > < / li > < li class = "toc-item toc-level-3" > < a class = "toc-link" href = "#Configure-nginx" > < span class = "toc-text" > Configure nginx< / span > < / a > < / li > < / ol > < / li > < li class = "toc-item toc-level-2" > < a class = "toc-link" href = "#Configure-automatic-renewal" > < span class = "toc-text" > Configure automatic renewal< / span > < / a > < / li > < / ol >
< / div >
< / div >
< script > var arr = [ ] ; var ts = '' ; if ( $ ( '.post-toc-content' ) . children ( ) . length > 1 ) { var el = '.post-toc-content' ; ts = ( $ ( el ) . children ( 'ol' ) [ 0 ] . outerHTML ) ; } else { var el = '.toc' ; } ; for ( var i = 0 ; i < $ ( el ) . children ( 'li' ) . length ; i ++ ) { arr . push ( $ ( el ) . children ( 'li' ) [ i ] . outerHTML ) ; } ; arr . splice ( arr . length / 2 , 0 , '</span><span class=".en">' ) ; arr . unshift ( ts ) ; arr . unshift ( '<span class=".zh">' ) ; arr . push ( '</span>' ) ; $ ( el ) . html ( arr . join ( '' ) ) ; < / script > < div class = "post-content" > < span class = ".zh" >
< p > 断断续续玩web已经一年了,一些之前从腾讯云申的TrustAsia证书已经陆陆续续开始过期,很方..于是开始尝试申请Let’s Encrypt的免费证书,并实现自动续期|´・ω・)ノ< / p >
< / span >
< span class = ".en" >
< p > I’ve been playing on the web intermittently for a year, and some of the TrustAsia certificates from Tencent’s Yunshang have started to expire one after another. It’s very fragrant.. So I started to try to apply for Let’s Encrypt’s free certificate, and realized automatic renewal|´・ω・)ノ< / p >
< / span >
< a id = "more" > < / a >
< script >
session.onload(function(){
if(page.tran.getLang() == 'en'){
tips.warning({
title: 'Caution',
position: 'topRight',
message: 'This page was translated by Machine!!',
buttons: [['< button > Show Original Page< / button > ', function (instance, toast) {
page.tran.setLang('zh');
instance.hide({ transitionOut: 'fadeOut' }, toast, 'button');
}, true]]
});
}
});
< / script >
< span class = ".zh" >
< h2 id = "前提条件" > < a href = "#前提条件" class = "headerlink" title = "前提条件" > < / a > 前提条件< / h2 > < ul >
< li > 必须是Centos7系统,其它未测试,不保证有效< / li >
< li > 有自己的域名< / li >
< li > 确认dns已将域名指向服务器< / li >
< li > 防火墙放行80与443端口< / li >
< li > 已配置好nginx代理,并< code > 可以通过http访问域名< / code > (一定确定能访问)< / li >
< / ul >
< h2 id = "安装certbot" > < a href = "#安装certbot" class = "headerlink" title = "安装certbot" > < / a > 安装certbot< / h2 > < p > 通过yum安装certbot< / p >
< figure class = "highlight plain" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > $ yum update #更新yum源< / span > < br > < span class = "line" > $ yum install -y epel-release #安装epel源< / span > < br > < span class = "line" > $ yum install -y certbot #安装certbot< / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< h2 id = "初次申领证书" > < a href = "#初次申领证书" class = "headerlink" title = "初次申领证书" > < / a > 初次申领证书< / h2 > < h3 id = "初次申领某域名证书" > < a href = "#初次申领某域名证书" class = "headerlink" title = "初次申领某域名证书" > < / a > 初次申领某域名证书< / h3 > < p > 格式为< / p >
< figure class = "highlight plain" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > $ certbot certonly --webroot -w [Web站点目录] -d [站点域名] -m [联系人email地址] --agree-tos< / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< p > 例如< / p >
< figure class = "highlight plain" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > $ certbot certonly --webroot -w / opt/ www/ demo.yourdomain.com -d demo.yourdomain.com -m yourname@gmail.com --agree-tos< / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< h3 id = "证书位置" > < a href = "#证书位置" class = "headerlink" title = "证书位置" > < / a > 证书位置< / h3 > < p > 证书存放在< code > /etc/letsencrypt/live/demo.yourdomain.com/< / code > 文件夹中。< br > 一共有4个文件,你可能要用到的是< code > fullchain.pem< / code > 和< code > privkey.pem< / code > 。< / p >
< h3 id = "配置nginx" > < a href = "#配置nginx" class = "headerlink" title = "配置nginx" > < / a > 配置nginx< / h3 > < p > 在相应的< code > server{}< / code > 中加入以下内容:< / p >
< figure class = "highlight plain" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < span class = "line" > 10< / span > < br > < span class = "line" > 11< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > listen 443 ssl;< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > ssl_certificate / etc/ letsencrypt/ live/ demo.yourdomain.com/ fullchain.pem; #2< / span > < br > < span class = "line" > ssl_certificate_key / etc/ letsencrypt/ live/ demo.yourdomain.com/ privkey.pem; #3< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > ssl_session_cache shared:SSL:1m;< / span > < br > < span class = "line" > ssl_session_timeout 5m;< / span > < br > < span class = "line" > ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;< / span > < br > < span class = "line" > ssl_protocols TLSv1 TLSv1.1 TLSv1.2;< / span > < br > < span class = "line" > ssl_prefer_server_ciphers on;< / span > < br > < span class = "line" > error_page 404 = / 404.php;< / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< p > 例如< / p >
< figure class = "highlight plain" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < span class = "line" > 10< / span > < br > < span class = "line" > 11< / span > < br > < span class = "line" > 12< / span > < br > < span class = "line" > 13< / span > < br > < span class = "line" > 14< / span > < br > < span class = "line" > 15< / span > < br > < span class = "line" > 16< / span > < br > < span class = "line" > 17< / span > < br > < span class = "line" > 18< / span > < br > < span class = "line" > 19< / span > < br > < span class = "line" > 20< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > server { < / span > < br > < span class = "line" > listen 443 ssl;< / span > < br > < span class = "line" > listen 80;< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > server_name demo.yourdomain.com; #1< / span > < br > < span class = "line" > root / opt/ www/ demo.yourdomain.com;< / span > < br > < span class = "line" > index index.html;< / span > < br > < span class = "line" > client_max_body_size 1000M;< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > ssl_certificate / etc/ letsencrypt/ live/ demo.yourdomain.com/ fullchain.pem; #2< / span > < br > < span class = "line" > ssl_certificate_key / etc/ letsencrypt/ live/ demo.yourdomain.com/ privkey.pem; #3< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > ssl_session_cache shared:SSL:1m;< / span > < br > < span class = "line" > ssl_session_timeout 5m;< / span > < br > < span class = "line" > ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;< / span > < br > < span class = "line" > ssl_protocols TLSv1 TLSv1.1 TLSv1.2;< / span > < br > < span class = "line" > ssl_prefer_server_ciphers on;< / span > < br > < span class = "line" > error_page 404 = / 404.html;< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > } < / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< p > 配置成功后执行如下指令:< / p >
< figure class = "highlight plain" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > $ nginx -t #检查nginx conf语法< / span > < br > < span class = "line" > $ systemctl restart nginx #重启nginx< / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< h2 id = "配置自动续期" > < a href = "#配置自动续期" class = "headerlink" title = "配置自动续期" > < / a > 配置自动续期< / h2 > < p > 编辑crontab规则:(< a href = "https://www.cnblogs.com/p0st/p/9482167.html" target = "_blank" rel = "noopener" > 初次配置crontab< / a > )< / p >
< figure class = "highlight plain" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > $ crontab -e< / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< p > 键入以下内容(每月1号5时刷新证书并重启nginx)保存并退出< / p >
< figure class = "highlight plain" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > 00 05 01 * * / usr/ bin/ certbot renew --quiet & & / bin/ systemctl restart nginx< / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< p > 重启crontab< / p >
< figure class = "highlight plain" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > $ systemctl restart crond.service< / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< hr >
< p > 参考链接:< br > < a href = "https://blog.csdn.net/sheng119/article/details/72956717" target = "_blank" rel = "noopener" > https://blog.csdn.net/sheng119/article/details/72956717< / a > < / p >
< / span >
< span class = ".en" >
< h2 id = "Prerequisites" > < a href = "#Prerequisites" class = "headerlink" title = "Prerequisites" > < / a > Prerequisites< / h2 > < ul >
< li > Must be Centos7 system, others have not been tested and are not guaranteed to be valid< / li >
< li > Have your own domain name< / li >
< li > Confirm that dns has pointed the domain name to the server< / li >
< li > The firewall allows port 80 and 443< / li >
< li > The nginx proxy has been configured, and < code > domain name can be accessed via http< / code > (be sure to be able to access)< / li >
< / ul >
< h2 id = "Install-certbot" > < a href = "#Install-certbot" class = "headerlink" title = "Install certbot" > < / a > Install certbot< / h2 > < p > Install certbot via yum< / p >
< figure class = "highlight plain" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > $ yum update #Update yum source< / span > < br > < span class = "line" > $ yum install -y epel-release #Install epel source< / span > < br > < span class = "line" > $ yum install -y certbot #Install certbot< / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< h2 id = "Initial-application-certificate" > < a href = "#Initial-application-certificate" class = "headerlink" title = "Initial application certificate" > < / a > Initial application certificate< / h2 > < h3 id = "Apply-for-a-domain-name-certificate-for-the-first-time" > < a href = "#Apply-for-a-domain-name-certificate-for-the-first-time" class = "headerlink" title = "Apply for a domain name certificate for the first time" > < / a > Apply for a domain name certificate for the first time< / h3 > < p > The format is< / p >
< figure class = "highlight plain" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > $ certbot certonly --webroot -w [Web site directory] -d [domain name] -m [contact email address] --agree-tos< / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< p > E.g< / p >
< figure class = "highlight plain" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > $ certbot certonly --webroot -w / opt/ www/ demo.yourdomain.com -d demo.yourdomain.com -m yourname@gmail.com --agree-tos< / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< h3 id = "Certificate-location" > < a href = "#Certificate-location" class = "headerlink" title = "Certificate location" > < / a > Certificate location< / h3 > < p > The certificate is stored in the < code > /etc/letsencrypt/live/demo.yourdomain.com/< / code > folder.< br > There are 4 files in total, you may need to use < code > fullchain.pem< / code > and < code > privkey.pem< / code > .< / p >
< h3 id = "Configure-nginx" > < a href = "#Configure-nginx" class = "headerlink" title = "Configure nginx" > < / a > Configure nginx< / h3 > < p > Add the following content to the corresponding < code > server{}< / code > :< / p >
< figure class = "highlight plain" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < span class = "line" > 10< / span > < br > < span class = "line" > 11< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > listen 443 ssl;< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > ssl_certificate / etc/ letsencrypt/ live/ demo.yourdomain.com/ fullchain.pem; #2< / span > < br > < span class = "line" > ssl_certificate_key / etc/ letsencrypt/ live/ demo.yourdomain.com/ privkey.pem; #3< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > ssl_session_cache shared:SSL:1m;< / span > < br > < span class = "line" > ssl_session_timeout 5m;< / span > < br > < span class = "line" > ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;< / span > < br > < span class = "line" > ssl_protocols TLSv1 TLSv1.1 TLSv1.2;< / span > < br > < span class = "line" > ssl_prefer_server_ciphers on;< / span > < br > < span class = "line" > error_page 404 = / 404.php;< / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< p > E.g< / p >
< figure class = "highlight plain" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < span class = "line" > 10< / span > < br > < span class = "line" > 11< / span > < br > < span class = "line" > 12< / span > < br > < span class = "line" > 13< / span > < br > < span class = "line" > 14< / span > < br > < span class = "line" > 15< / span > < br > < span class = "line" > 16< / span > < br > < span class = "line" > 17< / span > < br > < span class = "line" > 18< / span > < br > < span class = "line" > 19< / span > < br > < span class = "line" > 20< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > server { < / span > < br > < span class = "line" > listen 443 ssl;< / span > < br > < span class = "line" > listen 80;< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > server_name demo.yourdomain.com; #1< / span > < br > < span class = "line" > root / opt/ www/ demo.yourdomain.com;< / span > < br > < span class = "line" > index index.html;< / span > < br > < span class = "line" > client_max_body_size 1000M;< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > ssl_certificate / etc/ letsencrypt/ live/ demo.yourdomain.com/ fullchain.pem; #2< / span > < br > < span class = "line" > ssl_certificate_key / etc/ letsencrypt/ live/ demo.yourdomain.com/ privkey.pem; #3< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > ssl_session_cache shared:SSL:1m;< / span > < br > < span class = "line" > ssl_session_timeout 5m;< / span > < br > < span class = "line" > ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;< / span > < br > < span class = "line" > ssl_protocols TLSv1 TLSv1.1 TLSv1.2;< / span > < br > < span class = "line" > ssl_prefer_server_ciphers on;< / span > < br > < span class = "line" > error_page 404 = / 404.html;< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > } < / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< p > After the configuration is successful, execute the following instructions:< / p >
< figure class = "highlight plain" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > $ nginx -t #Check nginx conf syntax< / span > < br > < span class = "line" > $ systemctl restart nginx #Restart nginx< / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< h2 id = "Configure-automatic-renewal" > < a href = "#Configure-automatic-renewal" class = "headerlink" title = "Configure automatic renewal" > < / a > Configure automatic renewal< / h2 > < p > Edit crontab rules: (< a href = "https://www.cnblogs.com/p0st/p/9482167.html" target = "_blank" rel = "noopener" > First configuration crontab< / a > )< / p >
< figure class = "highlight plain" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > $ crontab -e< / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< p > Type the following (refresh the certificate and restart nginx on the 1st and 5th of each month) to save and exit< / p >
< figure class = "highlight plain" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > 00 05 01 * * / usr/ bin/ certbot renew --quiet & & / bin/ systemctl restart nginx< / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< p > Restart crontab< / p >
< figure class = "highlight plain" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > $ systemctl restart crond.service< / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< hr >
< p > Reference link:< br > < a href = "https://blog.csdn.net/sheng119/article/details/72956717" target = "_blank" rel = "noopener" > https://blog.csdn.net/sheng119/article/details/72956717< / a > < / p >
< / span >
< / div >
< div class = "post-copyright" >
< p class = "copyright-item" >
< span > Author: < / span >
< a href = "https://iotcat.me/" target = "_blank" rel = "noopener" > IoTcat< / a >
< / p >
< p class = "copyright-item" >
< span > Link: < / span >
< a href = "https://www.eee.dog/tech/ssl-auto-apply.html" > https://www.eee.dog/tech/ssl-auto-apply.html< / a >
< / p >
< p class = "copyright-item" >
< span > License: < / span > < a rel = "license" href = "http://creativecommons.org/licenses/by-nc/4.0/" target = "_blank" > 知识共享署名-非商业性使用 4.0 国际许可协议< / a >
< / p >
< / div >
< footer class = "post-footer" >
< div class = "post-tags" >
< a href = "/tags/centos7/" > centos7< / a >
< a href = "/tags/ssl/" > ssl< / a >
< / div >
< nav class = "post-nav" > < a class = "prev" href = "/tech/js-notes.html" >
< i class = "iconfont icon-left" > < / i >
< span class = "prev-text nav-default" > < span class = ".zh" > JS中那些惊艳的操作< / span > < span class = ".en" > Those amazing operations in JS< / span > < / span >
< span class = "prev-text nav-mobile" > Prev< / span >
< / a >
< a class = "next" href = "/notes/digital-circuit.html" >
< span class = "next-text nav-default" > < span class = ".zh" > 数电期中总结< / span > < span class = ".en" > Mid-term Summary of Digital Circuits< / span > < / span >
< span class = "prev-text nav-mobile" > Next< / span >
< i class = "iconfont icon-right" > < / i >
< / a >
< / nav > < / footer >
< / article > < script > $ ( ( ) = > { v a r p = w i n d o w . l o c a t i o n . p a t h n a m e ; s e t T i m e o u t ( ( ) = > { i f ( w i n d o w . l o c a t i o n . p a t h n a m e = = p ) t i p s . s h o w ( {
title: 'tips',
position: 'topRight',
message: ((page.tran.getLang() == 'zh')?"此文章预计阅读 3 分钟哦~": "Read this page will spend around 7 minutes~")
})}, 6000)})< / script >
< / div > < div class = "comments" id = "comments" > < div id = "vcomments" > < / div >
< / div > < / div >
< / main >
< footer id = "footer" class = "footer" >
< script >
page_obj = {
layout: "post",
comments: "true"
};
< / script > < div class = "social-links" > < a href = "mailto:i@iotcat.me" class = "iconfont icon-email" title = "email" > < / a >
< a href = "https://github.com/iotcat" target = "_blank" rel = "noopener" class = "iconfont icon-github" title = "github" > < / a >
< a href = "/atom.xml" class = "iconfont icon-rss" title = "rss" > < / a >
< / div > < div class = "copyright" > < span id = "/tech/ssl-auto-apply.html" class = "statistic leancloud_visitors" >
< em > Visitors < / em > < i class = "leancloud-visitors-count" > ??< / i >
< span class = "division" > |< / span >
< em > Reading < / em > 7 min
< / span >
< br >
< span class = "power-by" >
Powered by < a class = "hexo-link" href = "" onClick = "page.showUshio();" > Ushio< / a >
< / span >
< span class = "division" > |< / span >
< span class = "theme-info" >
Theme -
< a class = "theme-link" href = "https://github.com/iotcat/kayo" target = "_blank" rel = "noopener" > Kayo< / a >
< / span >
< span class = "copyright-year" > © 2018 - 2020< span class = "heart shaky" >
< i class = "iconfont icon-heart" > < / i >
< / span >
< span class = "author" > IoTcat< / span >
< / span >
< / div >
< / footer >
< div class = "back-to-top" id = "back-to-top" >
< i class = "iconfont icon-up" > < / i >
< / div >
< / div >
< script src = "https://cdn.yimian.xyz/kayo/lib/valine/valine.min.js" data-pjax > < / script >
< style >
/* 背景图片 */
#veditor {
background-image: url(https://cdn.yimian.xyz/img/blog/comments_bg.webp);
background-size: contain;
background-repeat: no-repeat;
background-position: right;
background-color: rgba(255, 255, 255, 0);
resize: vertical
}
/* 头像旋转 */
img.vimg {
transition: all 1s /* 旋转时间为 1s */
}
img.vimg:hover {
transform: rotate(360deg);
-webkit-transform: rotate(360deg);
-moz-transform: rotate(360deg);
-o-transform: rotate(360deg);
-ms-transform: rotate(360deg);
}
/* 盒子模式 */
#vcomments .vcards .vcard {
padding: 15px 20px 0 20px;
border-radius: 10px;
margin-bottom: 15px;
box-shadow: 0 0 4px 1px rgba(0, 0, 0, .12);
transition: all .3s
}
#vcomments .vcards .vcard:hover {
box-shadow: 0 0 8px 3px rgba(0, 0, 0, .12)
}
#vcomments .vcards .vcard .vh .vcard {
border: none;
box-shadow: none;
}
< / style >
< script >
pjax_valine = () => {
$.get('https://auth.yimian.xyz/getEmailHash.php', function(res){
if(page.tran.getLang() == 'zh'){
var lan = 'zh-CN';
var metaPlaceholder = {"nick":"昵称/QQ号","mail":"邮箱(完全保密)"};
var tagMeta = ["博主","小伙伴","访客"];
var placeholder = "填写邮箱可以及时收到回复哦(●'◡'●)";
}else{
var lan = 'en';
var metaPlaceholder = {"nick":"Nickname/QQ","mail":"EMail"};
var tagMeta = ["Master","Friend","Visitor"];
var placeholder = "Leave some comments here (●'◡'●)";
}
new Valine({
el: '#vcomments',
appId: 'eVzpK7EyT6OafJvXWIRminWT-gzGzoHsz',
appKey: '2qjuEBgVE0BscTQnTmoS9roU',
master: '9b616ff4cd6c305e5970bee7b1bd9b1f', //博主邮箱md5
tagMeta: tagMeta, //标识字段名
friends: res, //["b6ddef7c7e1c647e7767afeacdfb7b64","46dd4e6fef4f9591736c4723a965ca2e","6132d77f9f0ae060bc733090991acecb","3e00e104b79d7c6e866c6b23c6ba6dfc"], //小伙伴邮箱Md5
metaPlaceholder: metaPlaceholder,
placeholder: placeholder,
lang: lan,
path: window.location.pathname,
enableQQ: true,
visitor: true,
emojiCDN: '//i0.hdslb.com/bfs/emote/',
emojiMaps: {
"tv_doge": "6ea59c827c414b4a2955fe79e0f6fd3dcd515e24.png",
"tv_亲亲": "a8111ad55953ef5e3be3327ef94eb4a39d535d06.png",
"tv_偷笑": "bb690d4107620f1c15cff29509db529a73aee261.png",
"tv_再见": "180129b8ea851044ce71caf55cc8ce44bd4a4fc8.png",
"tv_冷漠": "b9cbc755c2b3ee43be07ca13de84e5b699a3f101.png",
"tv_发怒": "34ba3cd204d5b05fec70ce08fa9fa0dd612409ff.png",
"tv_发财": "34db290afd2963723c6eb3c4560667db7253a21a.png",
"tv_可爱": "9e55fd9b500ac4b96613539f1ce2f9499e314ed9.png",
"tv_吐血": "09dd16a7aa59b77baa1155d47484409624470c77.png",
"tv_呆": "fe1179ebaa191569b0d31cecafe7a2cd1c951c9d.png",
"tv_呕吐": "9f996894a39e282ccf5e66856af49483f81870f3.png",
"tv_困": "241ee304e44c0af029adceb294399391e4737ef2.png",
"tv_坏笑": "1f0b87f731a671079842116e0991c91c2c88645a.png",
"tv_大佬": "093c1e2c490161aca397afc45573c877cdead616.png",
"tv_大哭": "23269aeb35f99daee28dda129676f6e9ea87934f.png",
"tv_委屈": "d04dba7b5465779e9755d2ab6f0a897b9b33bb77.png",
"tv_害羞": "a37683fb5642fa3ddfc7f4e5525fd13e42a2bdb1.png",
"tv_尴尬": "7cfa62dafc59798a3d3fb262d421eeeff166cfa4.png",
"tv_微笑": "70dc5c7b56f93eb61bddba11e28fb1d18fddcd4c.png",
"tv_思考": "90cf159733e558137ed20aa04d09964436f618a1.png",
"tv_惊吓": "0d15c7e2ee58e935adc6a7193ee042388adc22af.png",
"tv_打脸": "56ab10b624063e966bfcb76ea5dc4794d87dfd47.png",
"tv_抓狂": "fe31c08edad661d63762b04e17b8d5ae3c71a757.png",
"tv_抠鼻": "c666f55e88d471e51bbd9fab9bb308110824a6eb.png",
"tv_斜眼笑": "911f987aa8bc1bee12d52aafe62bc41ef4474e6c.png",
"tv_无奈": "ea8ed89ee9878f2fece2dda0ea8a5dbfe21b5751.png",
"tv_晕": "5443c22b4d07fb1907ccc610c8e6db254f2461b7.png",
"tv_流汗": "cead1c351ab8d79e9f369605beb90148db0fbed3.png",
"tv_流泪": "7e71cde7858f0cd50d74b0264aa26db612a8a167.png",
"tv_流鼻血": "c32d39db2737f89b904ca32700d140a9241b0767.png",
"tv_点赞": "f85c354995bd99e28fc76c869bfe42ba6438eff4.png",
"tv_生气": "26702dcafdab5e8225b43ffd23c94ac1ff932654.png",
"tv_生病": "8b0ec90e6b86771092a498c54f09fc94621c1900.png",
"tv_疑问": "0793d949b18d7be716078349c202c15ff166f314.png",
"tv_白眼": "c1d59f439e379ee50eef488bcb5e5378e5044ea4.png",
"tv_皱眉": "72ccad6679fea0d14cce648b4d818e09b8ffea2d.png",
"tv_目瞪口呆": "0b8cb81a68de5d5365212c99375e7ace3e7891b7.png",
"tv_睡着": "8b196675b53af58264f383c50ad0945048290b33.png",
"tv_笑哭": "1abc628f6d4f4caf9d0e7800878f4697abbc8273.png",
"tv_腼腆": "89712c0d4af73e67f89e35cbc518420380a7f6f4.png",
"tv_色": "61822c7e9aae5da76475e7892534545336b23a6f.png",
"tv_调侃": "4bc022533ef31544ca0d72c12c808cf4a1cce3e3.png",
"tv_调皮": "b9c41de8e82dd7a8515ae5e3cb63e898bf245186.png",
"tv_鄙视": "6e72339f346a692a495b123174b49e4e8e781303.png",
"tv_闭嘴": "c9e990da7f6e93975e25fd8b70e2e290aa4086ef.png",
"tv_难过": "87f46748d3f142ebc6586ff58860d0e2fc8263ba.png",
"tv_馋": "fc7e829b845c43c623c8b490ee3602b7f0e76a31.png",
"tv_鬼脸": "0ffbbddf8a94d124ca2f54b360bbc04feb6bbfea.png",
"tv_黑人问号": "45821a01f51bc867da9edbaa2e070410819a95b2.png",
"tv_鼓掌": "1d21793f96ef4e6f48b23e53e3b9e42da833a0f6.png"
// ... 更多表情
}
});
});
};
< / script > < script type = "text/javascript" src = "https://cdn.yimian.xyz/ushio-js/ushio-footer.min.js" > < / script >
< script >
session.onload(function(){
if(session.get('group') != 'anonymous'){
function insertNick(){
if($('.vnick').length){
$('.vnick').val(session.get('nickname'));
}else{
setTimeout(insertNick, 500);
}
}
function insertMail(){
if($('.vmail').length){
$('.vmail').val(session.get('email'));
}else{
setTimeout(insertMail, 500);
}
}
if(session.get('nickname')){
insertNick();
}
if(session.get('email')){
insertMail();
}
}
});
< / script >
< script type = "text/javascript" src = "https://cdn.yimian.xyz/kayo/lib/slideout/slideout.js" > < / script >
< script type = "text/javascript" src = "https://cdn.yimian.xyz/kayo/lib/fancybox/jquery.fancybox.pack.js" > < / script >
< script type = "text/javascript" src = "https://cdn.yimian.xyz/kayo/lib/iziToast/iziToast.min.js" > < / script >
< script type = "text/javascript" src = "https://cdn.yimian.xyz/kayo/lib/iziModal/iziModal.min.js" > < / script >
< script type = "text/javascript" src = "https://cdn.yimian.xyz/kayo/lib/mermaid/mermaid.min.js" > < / script >
< script type = "text/javascript" src = "https://cdn.yimian.xyz/kayo/js/src/kayo.js?v=1.0.0" data-pjax > < / script >
< script type = "text/javascript" src = "https://cdn.yimian.xyz/kayo/js/src/kayo-no-pjax.js?v=1.0.0" > < / script >
< script src = "https://cdn.yimian.xyz/kayo/lib/pjax/pjax.min.js" > < / script >
< script > w i n d o w . p j a x = n e w P j a x ( {
elements: 'a[href]:not([href^="#"]):not([href="javascript:void(0)"])',
selectors: ["head title, #main", "#footer"],
});/* lazyload */
window.imageLazyLoadSetting = {
isSPA: false,
processImages: null,
};
window.addEventListener("load",function(){var t=/\.(gif|jpg|jpeg|tiff|png)$/i,r=/^data:image\/[a-z]+;base64,/;Array.prototype.slice.call(document.querySelectorAll("img[data-original]")).forEach(function(a){var e=a.parentNode;"A"===e.tagName&&(e.href.match(t)||e.href.match(r))&&(e.href=a.dataset.original)})});
/* 第一次载入页面加载的函数 */
pjax_ini = () => {
/* 关闭侧边栏 */
window.slideout.close();
if(page_obj.comments == "true"){pjax_valine();}pjax_google_analytics();mermaid.init(undefined, $(".mermaid"));/* lazy load */
!function(n){n.imageLazyLoadSetting.processImages=o;var i=n.imageLazyLoadSetting.isSPA,r=Array.prototype.slice.call(document.querySelectorAll("img[data-original]"));function o(){i&&(r=Array.prototype.slice.call(document.querySelectorAll("img[data-original]"))); for(var t,e,a=0;a< r.length ; a + + ) t = r[a],e=void 0 , 0 < = ( e = t.getBoundingClientRect()).bottom&&0<=e.left&&e.top<=(n.innerHeight||document.documentElement.clientHeight)&&function(){var t , e , n , i , o = r[a];t=o,e=function(){r=r.filter(function(t){return o ! = = t } ) } , n = new Image , i = t.getAttribute("data-original"),n.onload=function(){t.src=i,e&&e()},n.src=i}()}o(),n.addEventListener("scroll",function(){var t , e ; t = o,e=n,clearTimeout(t.tId),t.tId=setTimeout(function(){t.call(e)},500)})}(this);
!function(){var t=/\.(gif|jpg|jpeg|tiff|png)$/i,r=/^data:image\/[a-z]+;base64,/;Array.prototype.slice.call(document.querySelectorAll("img[data-original]")).forEach(function(a){var e=a.parentNode;"A"===e.tagName&&(e.href.match(t)||e.href.match(r))&&(e.href=a.dataset.original)})}();
};
/* 第一次 执行 */
pjax_ini();var loadingBar = document.querySelector(".loading-bar");
var progress = document.querySelector(".loading-bar .progress");
var timer = null;
// Pjax 开始时执行的函数
var loadingbarStart = function () {
// 进度条默认已经加载 20%
var loadingBarWidth = 20;
// 进度条的最大增加宽度
var MAX_LOADING_WIDTH = 95;
// 显示进度条
loadingBar.classList.add("loading");
// 初始化进度条的宽度
progress.style.width = loadingBarWidth + "%";
clearInterval(timer);
timer = setInterval(function () {
// 进度条的增加速度(可以改为一个随机值,显得更加真实)
loadingBarWidth += 3;
// 当进度条到达 95% 后停止增加
if (loadingBarWidth > MAX_LOADING_WIDTH) {
loadingBarWidth = MAX_LOADING_WIDTH;
}
progress.style.width = loadingBarWidth + "%";
}, 500);
};
// Pjax 完成之后执行的函数
var loadingbarStop = function () {
clearInterval(timer);
progress.style.width = "100%";
loadingBar.classList.remove("loading");
setTimeout(function () {
progress.style.width = 0;
}, 400);
};/* Pjax 开始时,重新加载的函数 */
document.addEventListener("pjax:send", function () {loadingbarStart();
});
/* Pjax 完成后,重新加载的函数 */
document.addEventListener("pjax:complete", function () {
/* 重载带data-pjax的script,或者.pjax-reload属性内容的script */
$("script[data-pjax], .pjax-reload script").each(function () {
$(this).parent().append($(this).remove());
});
pjax_ini();loadingbarStop();
page.tran.setLang();
});
/* Pjax 出错,执行的函数 */
document.addEventListener("pjax:error", function () {
});< / script >
< / body >
< / html >