Hexo博客配置SSL证书

Hexo不必转换成静态网页再交给比如Nginx,tomcat这样的工具发布网站,内置了一个服务器。但是默认情况下是不带SSL证书的。

效果展示

以下三个服务器都是使用Hexo提供网页服务的。

基本步骤

1.准备SSL证书。

去提供云服务的官网下载自己购买的、已经备案的域名的SSL证书,比如阿里云,腾讯云,华为云等,这里介绍的是阿里云与腾讯云。
需要注意的是,这里需要下载的是服务器类型为Nginx的,后面配置时需要使用到。

阿里云下载解压后可以得到一个.pem文件和.key文件,而腾讯云有所不同,是一个.crt文件和.pem文件。

注意 以下配置方法以阿里云的为例,腾讯云方法一样,.crt文件的作用和.pem是相同的,也就是说阿里云中使用.pem在腾讯云中则使用.crt文件。

2.上传到云服务器

为了管理方便,在云服务器上自己hexo项目文件夹(也就是将来要发布成网站的文件夹)中新建ssl文件夹,把这两个文件上传到这个ssl文件夹中。比如说当前这个hexo项目文件夹为"withyan",则ssl文件夹即在withyan文件夹中,其中withyan文件夹的路径为:/root/withyan

3.配置server.js

整个自己的hexo项目有个入口地址,即server.js文件,目录为withyan/node_modules/hexo-server/lib
注意需要安装express,即在hexo项目目录下,输入命令如下:

## 或者npm
cnpm install express --save

接下来需要对这个server.js文件进行修改。

# 跳转到相应目录,备份一下需要修改的文件
$ cd withyan/node_modules/hexo-server/lib
$ cp server.js server.js.back

编辑这个server.js文件,修改后内容如下,注意需要根据实际情况修改SSL证书文件名:


var fs = require('fs');
var connect = require('connect');
var http = require('https');
var chalk = require('chalk');
var Promise = require('bluebird');
var open = require('opn');
var net = require('net');
var url = require('url');
var express = require('express');

var httpApp = express();

httpApp.all("*", (req, res, next) => {
  let host = req.headers.host;
  host = host.replace(/\:\d+$/, ''); // Remove port number
  res.redirect(307, `https://${host}${req.path}`);
});

httpApp.listen(80, function () {
 console.log('http on 80 Welcome to Smileyan.cn');
});

const options = {
    key : fs.readFileSync("/withyan.cn.key"),
    cert: fs.readFileSync("/withyan.cn.pem")
}

module.exports = function(args) {
  var app = connect();
  var config = this.config;
  var ip = args.i || args.ip || config.server.ip || undefined;
  var port = parseInt(args.p || args.port || config.server.port || process.env.port, 10) || 4000;
  var root = config.root;
  var self = this;

  return checkPort(ip, port).then(function() {
    return self.extend.filter.exec('server_middleware', app, {context: self});
  }).then(function() {
    if (args.s || args.static) {
      return self.load();
    }

    return self.watch();
  }).then(function() {
    return startServer(http.createServer(options,app), 443, ip);
  }).then(function(server) {
    var addr = server.address();
    var addrString = formatAddress(ip || addr.address, addr.port, root);

    self.log.info('Hexo is running at %s . Press Ctrl+C to stop.', chalk.underline(addrString));
    self.emit('server');

    if (args.o || args.open) {
      open(addrString);
    }

    return server;
  }).catch(function(err) {
    switch (err.code){
      case 'EADDRINUSE':
        self.log.fatal('Port %d has been used. Try other port instead.', port);
        break;

      case 'EACCES':
        self.log.fatal('Permission denied. You can\'t use port ' + port + '.');
        break;
    }

    self.unwatch();
    throw err;
  });
};

function startServer(server, port, ip) {
  return new Promise(function(resolve, reject) {
    server.listen(port, ip, function() {
      resolve(server);
    });

    server.on('error', reject);
  });
}

function checkPort(ip, port) {
  return new Promise(function(resolve, reject) {
    if (port > 65535 || port < 1) {
      return reject(new Error('Port number ' + port + ' is invalid. Try a number between 1 and 65535.'));
    }

    var server = net.createServer();

    server.once('error', reject);

    server.once('listening', function() {
      server.close();
      resolve();
    });

    server.listen(port, ip);
  });
}

function formatAddress(ip, port, root) {
  var hostname = ip;
  if (ip === '0.0.0.0' || ip === '::') {
    hostname = 'localhost';
  }

  return url.format({protocol: 'http', hostname: hostname, port: port, path: root});
}

分析

  • 首先需要引入相关依赖
    • var fs = require(‘fs’);
    • var express = require(‘express’);
  • 需要更改以前默认使用的http改为https
    • 以前是 var http = require(‘http’);
    • 现在是 var http = require(‘https’);
  • 需要配置httpApp
    • 可以理解为把所有http在80端口的请求拦截转到https进行处
    • var httpApp = express() 和 httpApp.all 和httpApp.listen
  • 当然,需要配置一下SSL相关证书文件路径,即const options
  • 最后把以前的http.createServer(app) 改为 http.createServer(options,app)。
    • 需要自己再源代码中找一下。

好处与坏处

  • 好处:所有80端口的http请求全部都转到https请求;成功安装SSL证书,更加安全;显得高大上;治疗强迫症晚期的程序员患者相关疾病。
  • 坏处:从此使用 hexo s -p 4534 启动hexo项目后面的端口配置完全失效了。只能在80端口上运行。
4.测试效果

在hexo项目文件夹下,这里即withyan目录下,启动hexo

hexo s

然后打开浏览器访问自己的域名就可以成功了。

注意事项

总体来说比较简单,注意事项如下:

  1. 不要弄错了hexo-server目录的地址,在hexo这个项目下的node_modules,而不是在别的位置。
  2. 记得修改server.js之前进行备份,免得“回不了头”。
  3. 在基本理解的情况下进行修改,注意别改错了。
  4. 高版本的hexo可能会提示opn没有安装,安装也很简单,在hexo项目目录下,npm install opn --save即可。
  5. 有耐心,遇到问题慢慢解决。

注意:严禁抄袭!转载需要征得作者同意。谢谢

其他

Node.js安装SSL的例子

let express = require("express");

var https = require('https')
    ,fs = require("fs");

var options = {
    key : fs.readFileSync("./withyan.cn.key"),
    cert: fs.readFileSync("./withyan.cn.pem")
};
let app = express();
app.get('/', function (req, res) {
   res.send('Hello World');
})

https.createServer(options, app).listen(3011, function () {
    console.log('Https server listening on port ' + 3011);
});

启动

node app.js

效果
在这里插入图片描述

https://www.jianshu.com/p/638f364e0642?utm_source=oschina-app
https://www.jb51.net/article/141558.htm
https://www.jb51.net/article/141536.htm

总结

稍微读一下源码和官方文档,再加上查一下资料就能解决问题。

Smileyan
2020.1.4 18:59
2020.1.4 18:59

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

smile-yan

感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值