Nginx 是世界上最受欢迎的 Web 服务器之一,负责托管互联网上一些最大和流量最高的站点。 这是一个轻量级的选择,可以用作 Web 服务器或反向代理。在公司内部,像Zabbix、ELK都可以通过Nginx实现Web端的管理。
接下来,我将在 Ubuntu 20.04 服务器上安装 Nginx,创建自签名证书,设定访问https跳转,保障内网客户端浏览器与Web服务器之间的通讯安全。
┌──────────────────────────────────────────────────────────────────────┐
│ • MobaXterm Personal Edition v21.2 • │
│ (SSH client, X server and network tools) │
│ │
│ ➤ SSH session to testuser@192.168.226.131 │
│ • Direct SSH : ✔ │
│ • SSH compression : ✔ │
│ • SSH-browser : ✔ │
│ • X11-forwarding : ✔ (remote display is forwarded through SSH) │
│ │
│ ➤ For more info, ctrl+click on help or visit our website. │
└──────────────────────────────────────────────────────────────────────┘
Welcome to Ubuntu 20.04.3 LTS (GNU/Linux 5.4.0-91-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Sat 04 Dec 2021 02:32:23 PM UTC
System load: 0.06 Processes: 161
Usage of /: 25.3% of 23.74GB Users logged in: 1
Memory usage: 6% IPv4 address for ens192: 192.168.226.131
Swap usage: 0%
/home/testuser/source
sudo apt-get update
sudo apt-get install build-essential
$ wget https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.tar.gz
$ tar -zxf pcre-8.45.tar.gz
$ cd pcre-8.45
$ ./configure
$ make
$ sudo make install
$ wget http://zlib.net/zlib-1.2.11.tar.gz
$ tar -zxf zlib-1.2.11.tar.gz
$ cd zlib-1.2.11
$ ./configure
$ make
$ sudo make install
$ apt show openssl
Package: openssl
Version: 1.1.1f-1ubuntu2.9
Priority: important
Section: utils
Origin: Ubuntu
Maintainer: Ubuntu Developers -devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian OpenSSL Team -openssl-devel@lists.alioth.debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 1,287 kB
Depends: libc6 (>= 2.15), libssl1.1 (>= 1.1.1)
Suggests: ca-certificates
Homepage: https://www.openssl.org/
Task: minimal
Download-Size: 622 kB
APT-Sources: http://cn.archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages
Description: Secure Sockets Layer toolkit - cryptographic utility
$ wget https://www.openssl.org/source/old/1.1.1/openssl-1.1.1f.tar.gz
$ tar -zxvf openssl-1.1.1f.tar.gz
如果你默认没有安装过openssl,且想通过源码安装,可以执行以下命令,
$ wget https://www.openssl.org/source/openssl-1.1.1l.tar.gz
$ tar -zxf openssl-1.1.1l.tar.gz
$ cd openssl-1.1.1l
$ ./Configure darwin64-x86_64-cc --prefix=/usr
$ make
$ sudo make install
从nginx.org下载稳定版的源码压缩包进行解压并创建自己想要的安装路径。
$ wget https://nginx.org/download/nginx-1.20.2.tar.gz
$ tar zxf nginx-1.20.2.tar.gz
$ cd nginx-1.20.2.0
$ sudo mkdir -p /usr/local/nginx/
配置选项由./configure设置各种 NGINX 参数的脚本指定,包括源文件和配置文件的路径、编译器选项、连接处理方法和模块列表。
./configure --prefix=/usr/local/nginx/ --pid-path=/usr/local/nginx/logs/nginx.pid --with-pcre=../pcre-8.45 --with-zlib=../zlib-1.2.11 --with-http_ssl_module --with-openssl=/home/testuser/source/openssl-1.1.1f --with-stream --http-log-path=/usr/local/nginx/logs/access.log --error-log-path=/usr/local/nginx/logs/error.log --lock-path=/var/lock/nginx.lock --with-http_v2_module
$make
$sudo make install
编辑参数解释:
4. 编译安装完成后,由于nginx的安装路径不在系统变量中,所以需要设定$PATH变量(在.ash),才能方便NGINX的启动、停止,重启:
sudo vim /home/testuser/.bashrc
#添加NGINX可执行文件的安装路径
export PATH="/usr/local/nginx/bin:$PATH"
#使其生效
source .bashrc
#启动NGINX
sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
#设定NGINX开机自启动
cd lib/systemd/system
#在该目录下创建nginx.service
vim nginx.service
#添加以下脚本内容
[Unit]
Description=nginx - high performance web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
[Install]
WantedBy=multi-user.target
#设置开机自动启动
systemctl enable nginx.service
#重启nginx服务
systemctl restart nginx.service
[Unit]服务说明
After:依赖,当依赖的服务启动之后再启动自定义的服务
Type=forking是后台运行的形式
5.确认安装结果
sudo netstat -antup | grep 80
[sudo] password for test01:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 161759/nginx: maste
证书是由证书颁发机构或 CA进行数字签名。CA 是已确认证书中包含的信息准确无误的受信任第三方。对于拥有域名和公网IP的正常服务器来说,使用受信机构签名的证书是最好的选择。 但对于用于内网环境,或者是没有域名的测试服务器而言,自签名证书是折中的选择。接下来我将通过CA根证书签名服务器证书的方式创建http证书,一般来讲创建自签名证书有以下几个步骤:
openssl genrsa -des3 -out server.key 2048
输入要求有复杂性的密码,且至少包含八个字符。创建好的服务器密钥会生成并存储在server.key文件中。
openssl rsa -in server.key -out server.key.insecure
mv server.key server.key.secure
mv server.key.insecure server.key
不安全的密钥现在被命名为server.key
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
server {
listen 80;
listen 443 ssl;
server_name 192.168.226.131;
ssl_certificate /usr/local/nginx/certs/server.crt;
ssl_certificate_key /usr/local/nginx/certs/server.key;
if ($scheme = 'http') {
return 301 https://$host$request_uri;
}
systemctl restart nginx
进阶:如果想创建自己的内部CA,签发自签名证书,可以按以下步骤:
sudo mkdir /etc/ssl/CA
sudo mkdir /etc/ssl/newcerts
sudo sh -c "echo '01' > /etc/ssl/CA/serial"
sudo touch /etc/ssl/CA/index.txt
dir = /etc/ssl # Where everything is kept
database = $dir/CA/index.txt # database index file.
certificate = $dir/certs/cacert.pem # The CA certificate
serial = $dir/CA/serial # The current serial number
private_key = $dir/private/cakey.pem# The private key
openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650
sudo mv cakey.pem /etc/ssl/private/
sudo mv cacert.pem /etc/ssl/certs/
sudo openssl ca -in server.csr -config /etc/ssl/openssl.cnf
输入 CA 密钥的密码后,系统将会提示签署证书,并再次提交新证书。然后,我们应该会看到与证书创建相关的大量输出。
随后就会有一个/etc/ssl/newcerts/01.pem包含相同输出的新文件。创建新的证书文件,如zabbix.test.com.cert,复制并粘贴01.pem中以—BEGIN CERTIFICATE—开头,—END CERTIFICATE-----结结尾的所有内容。以后为其他服务器域名申请的证书将被命名为02.pem,03.pem等。
7. 将新证书复制到特定目录,如/usr/local/nginx/certs,并配置相应的应用程序使其生效。
8. 在浏览器中验证自签名证书与内部CA证书颁发的证书