注:这里说的“基于阿里云”并不是指完全依赖于阿里云,只要你拥有免费的CA证书(土豪任性也可以自己买~),完全可以不理鸟“阿里云”这个字眼,这里我也不是给谁打广告。。。
[TOC]
预先准备
域名购买
如果要使用阿里云提供的免费证书,你需要先从阿里云买一个域名,¥99买了三年的域名,也还是挺便宜的。
注意域名买了还需要自己去备案,否则的话,域名可能被禁掉,无法访问。
服务器购买
有了域名,需要将这个东东绑定到某一实体服务器主机上,术语“解析”。这里就没太大必要使用阿里云了,腾讯云学生版,¥1/月,配置还能比阿里云高,妥妥的。唯一的缺点是第一次购买除了要验证学生身份以外,还要抢每天限量的优惠券,不过我是第一次就抢到了,应该也不算麻烦,后面每个月就可以直接领了。啥?你不是学生?对不起,我不认识你~
值得注意的是,这里我们在阿里云买了名,但不是非得在它那里买服务器,其实域名和证书说不定也可以在腾讯云这边解决,但我们这里只买了阿里云的。
证书购买
购买地址
不得不说,证书真的是有点贵了。。。
阿里云上,除了前面提到的免费的,最便宜的一年5k,公司、单位啥的还好,个人能买的话,真的称得上是RMB玩家了。但是,重点来了,5k和12.8k中间夹了一个¥0.00的。
填完各种东西,阿里云还会提示添加一条TXT类型的解析,按照它的提示填好就行了。之后不久,进入到证书服务,你就能看到你的证书并下载了。
证书
证书下载
点击证书列表中的下载,你将看到很多可选项。
)
常见的 nginx、apache、tomcat、iis 等都有各自不同的版本以及相应的使用说明,就连我用的 Node.js,也可以通过下载“其他”选项的证书,实现相应的功能。
证书导入
这里,我使用的express框架,将证书导入到工程目录新创建的cert目录下,部分代码如下:
#!/usr/bin/env node
/**
* Module dependencies.
*/
var app = require('../app');
var debug = require('debug')('blog:server');
var fs = require('fs');
var https = require('https'); // 导入的时候,选择https模块,而非默认的http模块
var options = {
pfx: fs.readFileSync('./cert/xxxxxxxxxxx.pfx'), // 证书打包结果
passphrase: fs.readFileSync('./cert/pfx-password.txt') // 证书密码
};
/**
* Get port from environment and store in Express.
*/
var port = normalizePort(process.env.PORT || '80');
app.set('port', port);
/**
* Create https server.
*/
// 创建服务器的时候,第一个参数传入证书相关项,第二个为其它的服务器配置
var server = https.createServer(options, app);
/**
* Listen on provided port, on all network interfaces.
*/
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
/**
* Normalize a port into a number, string, or false.
*/
function normalizePort(val) {
var port = parseInt(val, 10);
if (isNaN(port)) {
// named pipe
return val;
}
if (port >= 0) {
// port number
return port;
}
return false;
}
/**
* Event listener for https server "error" event.
*/
function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}
var bind = typeof port === 'string'
? 'Pipe ' + port
: 'Port ' + port;
// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
}
/**
* Event listener for https server "listening" event.
*/
function onListening() {
var addr = server.address();
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
}
配置完成之后,你可能会发现并没有生效,为什么呢?没有重启。。。重启之后,正常情况下,你就会发现,Chrome里的警告就没了。