分类 server 下的文章

tomcat 配置 ssl 证书(二)

之前写过一篇配置 tomcat ssl 证书的文章 tomcat配置https(ssl证书),当时没有经过实操,是我找的证书格式转换工具,Java 同事实操的。也是有段波折才配置成功的。但因为我没有参与,所以并不知道会遇到什么样的问题。

前一家任职公司老板找我说,之前的项目出现问题,让我帮忙维护一下。开始是不愿意的,后来给我画饼,说后面有外包项目,可以介绍给我。晾了他一段时间(跟他有仇,离职扣我大半月工资),觉得手痒,就去看了问题。

发现并不是 bug,浏览器提示 “Mix content”,意思就是 https 页面不能请求 http 内容,请求被浏览器阻拦了。查了一堆方法,都是屁话,最终还是得回归到请求 schame 上。就是将请求由 http 改成 https。

之前请求是 Java 做的,她们默认不会去解析子域名,而是通过 ip 地址 + 路径的方式访问项目。我不太确定客户申请的 通域 ssl 是否能够使用。但还是按照之前的教程配了:

在 server.xml 中找到 Connector 属性 port 为 8443 的配置项(默认被注释了),添加以下属性

#pfx 证书存放地址,相对地址为 apache-tomcat 安装目录
keystoreFile="cert/star.jasonli.com.pfx"
# pfx的证书标准 为PKCS12 ,后面是生成证书时填写的密码
keystoreType="PKCS12" keystorePass="123456"

pfx 格式证书在线转化:SSL证书格式转换工具

复制一份 Host,添加到 Host 同级别的位置,修改 name 属性为 ip 地址

重启一下 tomcat(就是执行 bin 下面的 shutdown.sh 和 startup.sh 文件),页面访问有点慢,因为每次 tomcat 重启都会重新 解压一遍 webapps 下的 war 包。然后就报错了,说当前链接不安全,查看证书是存在的,但提示无效。

兜兜转转查了一圈资料,有的教程是自己生成的证书和秘钥,末了直接忽视证书无效的问题,pass掉!最后看到有一哥们说 tomcat 不能配置 ip 地址 的 https 访问。大概如此吧,但我确实配置过 httpd (apache 的 缩减版)的 ip 地址 ssl。有点矛盾,想到客户申请的就是 *.jasonli.com 的 通域证书,所以对 ip 无效应该也不太难理解吧!

解析一个子域名,将 Host 中的 name 属性该成子域名,重启 tomcat, ok!

如何在 https 网页中引入 http 资源: Mixed Content?

https 页面只能加载 https 资源,网上提供的方法是绕过了问题,将 http 资源链接转化为 https 资源。

在 https 页面的 header 部分嵌入以下内容:

<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">

这样,浏览器在判断资源类型时,会自动给 http 资源添加上 s

这种解决方案试用于资源本身是可以通过 https 进行访问的情况。

还有网友建议说,直接把 http 资源所在服务器添加 ssl 证书,使用 https 服务。这个更扯,我要是能转,也不用找方法。

最后没办法,只好把 https 页面降级为 http。

linux 复制文件下的所有文件

前言

一般情况下 cp -rf /aa/* /bb/ 下就可以了 。

这次是复制带有 git 版本信息的代码内容,结果只有代码部分成功了,隐藏文件(.开头的文件)都没有成功。

解决方案

直接复制所有文件(包括隐藏文件)

cp -rf /aa/. /bb/

Linux下root用户Operation not permitted

问题描述

使用 ssh 远程登录,root账号,照常理说,是不应该有权限不够的问题。

尝试了一下 sudo ,也没有用。所有针对这个文件的操作,移动复制删除,都没有用:

mv .user.ini xx/

#Operation not permitted

解决方案

使用 chattr 指令修改文件属性

文件属性中携带 i 标识,不可以修改删除,或重命名(移动),也不可以创建链接,也不可以修改数据。
只有超管和处理 CAP_LINUX_IMMUTABLE 能力的程序能够修改或清除该属性。

可以通过 lsattr 指令查看文件属性标识

lsattr .user.ini
#----i--------e- .user.ini

发现存在 i 标识,清除该属性

chattr -i .user.ini
lsattr .user.ini
#-------------e- .user.ini

再次执行移动操作,成功!

CentOS7 中找不到 mysql 服务(yum安装)

问题描述

yum 安装的服务,默认可以使用 service 进行操作

yum install -y mysql
service mysqld start

但是启动不了,提示没有 mysqld 服务,找不到。

原因:

是这样的,你在 cento7 上运行 yum install mysql 会下载安装的是 MariaDB(这是 mysql 原班人马在 mysql 公司卖给其他公司几年后,防止 mysql 被 Oracle 闭源才新生成的一个 Mysql 的分支),而不是原来的 mysql 。

另外,所以你运行 yum install mysql 就相当于运行 yum install MariaDB
但是对于 MariaDB 的话,直接安装 MariaDB 是不会运行起来的服务的,因为你只安装了 MariaDB 的客户端,所以你还需要下载一系列的 MariaDB 组件就比 MariaDB-server(服务端)。

解决方法:

运行 yum search all mariaDB

然后会列出一系列软件包

mariadb-bench
mariadb-devel
mariadb-embedded
mariadb-server
mariadb-test
mariadb-libs

把这些安装一下就可以解决问题了(可选择安装哦,每个包都有介绍的)

其实搜索 mysql 也是一样的,我的情况是,安装了 mysql-bench 后,再次尝试启动 mysql 服务,就成功了。

CentOS 7.6 安装 composer 报错: SSL routines:tls_process_server_certificate:certificate verify failed

前言

想在新服务器上跑一个 Laravel 项目,默认需要安装 composer 库管理工具。

系统: Linux release 7.6.1810 (Core)
php: 7.3.3
下载来源站:https://getcomposer.org/download/

命令行安装步骤:

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

但是,在第一步从来源站 copy 安装脚本的时候就报错了:
copy()... OpenSSL Error messages: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed in Command line code

解决

百度找不到好的解决方案,求助 Google。找到这样一篇:OpenSSL Failed to enable crypto #6870,里面提到的解决方案:

Fixed by disable Kaspersky Antivirus

意思是关闭卡巴斯基防病毒进程。我的主机上是肯定没有安装这个东西的,猜想是不是防火墙在搞事情。

检查防火墙状态(centos7 高版本对 iptables 做了优化更新,把 iptables 服务改成了 firewalld

service firewalld status

防火墙并未开启(inactive)。在同一讨论问题中发现了另一个解决方案:error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed #3346

方案摘抄如下:

First: Check certificate file location which will be in default_cert_file key, you will found it in openssl_get_cert_locations() its php openssl function:

$ php -r "print_r(openssl_get_cert_locations());"
Array
(
    [default_cert_file] => /opt/lampp/share/openssl/cert.pem
    [default_cert_file_env] => SSL_CERT_FILE
    [default_cert_dir] => /opt/lampp/share/openssl/certs
    [default_cert_dir_env] => SSL_CERT_DIR
    [default_private_dir] => /opt/lampp/share/openssl/private
    [default_default_cert_area] => /opt/lampp/share/openssl
    [ini_cafile] => 
    [ini_capath] => 
)
Second: Download http://curl.haxx.se/ca/cacert.pem:

$ wget http://curl.haxx.se/ca/cacert.pem
Third: Copy certificate PEM file into default_cert_file location:

$ sudo mv cacert.pem /opt/lampp/share/openssl/cert.pem
My php-cli is under XAMPP and default_cert_file maybe point to some place that is different than this.
I hope anything after that should goes fine with you brothers.

按照他步骤进行,解决。

大致原因是 openssl 默认的证书不存在,验证失败。下载一个第三方提供的证书,放到配置目录下就好了。