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!

解决 basename 无法获取中文文件名的 bug

如题,本地环境为 windows 7,php 7.3.2,basename 函数正常获取中文文件名,但是在 centos 服务器 php 5.6 的环境下,只能获取到扩展名。例如: 文件 123.zip 只能输出 zip

这很有可能与环境或者 php 版本有关,但在现有环境不能修改的情况下,最好的解决方案就是使用自定义 basename 方法。

找到一个正则表达式处理的方法如下:

function get_basename($filename){
    return preg_replace('/^.+[\\\\\\/]/', '', $filename);
}

如何在 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。

传销关键词

碰到有人给你推销产品,第一反应应该是拒绝,尤其是话述里包含以下关键词的,很有可能是骗子或者传销人员:

考察项目、五级三晋制、发展下线国家暗中支持、北部湾大开发、民族资产、纯资本运作循环消费、轻松月入百万、低投入高回报、游戏理财、互动盘多层分销、复利投资、自愿连锁经营、消费多少返多少

天下没有免费的午餐,尤其是你还挣扎在社会的底层。

防人知心不可无,尤其是你刚踏入社会的时候。

php 高精度计算问题

转自:php高精度计算问题 - 周伯通的麦田

从事金融行业,资金运算频繁,这里说下我遇到的坑....稍不留神,用户资金可能损失几十万,甚至更可怕......直接上实例吧:

javascript

0.1 + 0.2 为啥不等于 0.3 ? (正确结果:0.30000000000000004)

0.8 * 7 为啥不等于 5.6 ? (正确结果:5.6000000000000005)

PHP

var_dump(intval(0.58 * 100));

正确结果是 57,而不是 58

浮点运算惹的祸

说明:如果用php的+-/计算浮点数的时候,可能会遇到一些计算结果错误的问题,比如上面 的 echo intval( 0.58100 );会打印57,而不是58,这个其实是计算机底层二进制无法精确表示浮点数的一个bug,是跨语言的,我用python也遇到这个问题。所以基本上大部分语言都提供了精准计算的类库或函数库,比如php有BC高精确度函数库,稍后我绍一下一些常用的BC高精确度函数使用。

还是回到上面的57,58问题。

为啥输出是57啊? PHP的bug么?

  要搞明白这个原因, 首先我们要知道浮点数的表示(IEEE 754):

  浮点数, 以64位的长度(双精度)为例, 会采用1位符号位(E), 11指数位(Q), 52位尾数(M)表示(一共64位).

  符号位:最高位表示数据的正负,0表示正数,1表示负数。

  指数位:表示数据以2为底的幂,指数采用偏移码表示

  尾数:表示数据小数点后的有效数字.

  这里的关键点就在于, 小数在二进制的表示, 关于小数如何用二进制表示, 大家可以百度一下, 我这里就不再赘述, 我们关键的要了解, 0.58 对于二进制表示来说, 是无限长的值(下面的数字省掉了隐含的1)..

  0.58的二进制表示基本上(52位)是: 00101000111101011100001010001111010111000010100011110.57的二进制表示基本上(52位)是: 001000111101011100001010001111010111000010100011110而两者的二进制, 如果只是通过这52位计算的话,分别是:

  0.58 -> 0.579999999999999960.57 -> 0.5699999999999999至于0.58 100的具体浮点数乘法, 我们不考虑那么细, 有兴趣的可以看(Floating point), 我们就模糊的以心算来看… 0.58 100 = 57.999999999

  那你intval一下, 自然就是57了….

  可见, 这个问题的关键点就是: “你看似有穷的小数, 在计算机的二进制表示里却是无穷的”

  因此, 不要再以为这是PHP的bug了, 这就是这样的…..

  PHP浮点型在进行+-*%/存在不准确的问题

继续看一段代码:

$a = 0.1;
$b = 0.7;
var_dump(($a + $b) == 0.8); // false

打印出来的值为 boolean false

  这是为啥?PHP手册对于浮点数有以下警告信息:

  Warning

  浮点数精度

  显然简单的十进制分数如同 0.1 或 0.7 不能在不丢失一点点精度的情况下转换为内部二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999…。

  这和一个事实有关,那就是不可能精确的用有限位数表达某些十进制分数。例如,十进制的 1/3 变成了 0.3333333. . .。

  所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数

那么上面的算式我们应该改写为

$a = 0.1;
$b = 0.7;
var_dump(bcadd($a,$b,2) == 0.8); // true

常用的高精度函数如下:

bcadd — 将两个高精度数字相加

  bccomp — 比较两个高精度数字,返回-1, 0, 1

  bcdiv — 将两个高精度数字相除

  bcmod — 求高精度数字余数

  bcmul — 将两个高精度数字相乘

  bcpow — 求高精度数字乘方

  bcpowmod — 求高精度数字乘方求模,数论里非常常用

  bcscale — 配置默认小数点位数,相当于就是Linux bc中的”scale=”

  bcsqrt — 求高精度数字平方根

  bcsub — 将两个高精度数字相减

BC高精确度函数库包含了:相加,比较,相除,相减,求余,相乘,n次方,配置默认小数点数目,求平方。这些函数在涉及到有关金钱计算时比较有用,比如电商的价格计算。

这样就可以解决浮点数运算的问题啦....

无论从事什么行业,只要做好两件事就够了,一个是你的专业、一个是你的人品,专业决定了你的存在,人品决定了你的人脉,剩下的就是坚持,用善良專業和真诚赢取更多的信任。

记一次医院探访

我围抱着火炉,

烤热漫长一生的一个时刻。

我知道这一时刻之外,

我其余的岁月,

我的亲人们的岁月,

远在屋外的大雪中,被寒风吹彻。

—— 刘亮程《寒风吹彻》

同事 K 生病了,那是上周四的事了。当时下午上班的时候,他提出来说实在撑不下去了,想请假回家休息一下。当时以为是感冒,所以在他第二天依然请假的时候,还有点奇怪。我也经历过感冒。因为体质好,一般的感冒在初期症状就消失了。一些重感冒确实比较难受,但从我记事起,就没有因为感冒发烧去过医院(当然不建议这样,实在不舒服,还是应该去医院检查一下的)。心里还有对他的一点嘲讽,“有点虚啊,小伙子!”

周六在家玩游戏,看电视。中午收到 K 的微信语音消息,说让我过去陪陪他,他住院了。我想你去医院挂点葡萄糖和盐水就好了,住院有点...还有就是要我过去陪他,确实不太想,一方面我觉的他的情况不需要,另一方面不想打断宅在家里看电视、玩游戏的悠闲生活。心里对他有些不满,一个感冒发烧就虚成这样。

周六晚上的时候,我们部门领导出动了,组了一个群聊,拉了我和另一个住在附近的同事,准备第二天去看看他,慰问一下。我想也行吧,同事一场,生病住院了,买点水果探望一下也是应该的。并且,医院离住的地方不远,走过去,送一下水果,说几句话,大概也就回来了。虽然领导说不用带东西,但我还是早早起来去楼下超市买了点。附近是有家花店,但考虑到太早花店不一定开门,还有就是花没有什么实质价值,又是男同事,没必要,就没买。

早上的凉风吹在身上,很舒服。按照导航步行大概 10 分钟就到了他的病房。比较现代化的病房,有独立卫生间,就是床有点小,如果是我睡的话,夜里翻身可不行。窗户开着,没注意窗帘,外面的是旁边建筑的屋顶,上面是一些中央空调外机。一间病房有两张床,床的左侧都摆放了一张床头柜,靠门的墙上有一个壁橱,两开门。而两张床前的空间摆了两张折叠床,大概是方便陪护人晚上短暂休息的。K 的床头柜上摆放了一台机器,拖出一根电,连接在他的食指上。机器上面展示的几段像心电图一样不断跳动的波形图。他的脸色不太好,调侃了他几句,我就站在窗边吹风了。过会儿,昨晚陪夜的同事来了,西装革履的打扮,应该是昨天参加完展览就过来了。虽然他不算白,但还能勉强看出来眼袋有点重。聊了一会儿,得知好像是慢性肠炎,这两天一直在拉肚子。而且还要转院,陪夜同事打了 120 ,和之后陆续到来的同事跟领导去了另一家医院。我和陪夜同事坐的是救护车。下车的时候,听到急救的人惋惜的说,这么年轻就得了尿毒症,我才突然认识到情况的严重性。

怎么突然就变成了这样,之前的调侃,现在看来像是嘲讽。有点惋惜,然后就是等待了。下午的时候跟另外的同事、领导帮他缴费拿药,送血检、尿检样本。中间的时候有些无聊。急诊部里充斥着形形色色的人,但没有笑容。有的两三个聚在一起聊着什么,有的是坐在走道的急救病床上,有的在吃东西。急救部门外有些抽烟的人,烟丝四下飘散,很快没了踪迹。急救抢救室的大门时不时的打开,接着就是呼唤病人家属的护士的声音。从中午到晚上,也会有救护车的声音不间断地到来,急救部里面会出来几个穿着特殊制服的人过来抬担架。有些抢救过来了,有些没有,没有的就会有病人家属的恸哭。K 的母亲晚上 9 点多到了,领导去接的她,短暂的探望了一下,然后就跟我们回去了。领导让她先休息一晚,第二天我们要上班,不能陪护,之后的陪护工作会交给她。

回来的路上,晚风吹拂,依然很舒服。旁边的 K 的母亲一直不说话,只有我们问她的时候才会答一句。同事把我送到家的附近。走在路上,周围灯火不断,但很安静。静下心来,忽然有限惶恐。不是因为今天的探望,也不是急救部的在我眼前消逝的生命,而是我突然意识到的自己对生命的无感淡漠。我什么时候变成了这样,是因为我的职业让我习惯了枯燥乏味,还是我成长经历让我看淡了世间冷暖?不知道,因为,那仅有的一点惶恐也消逝了,随风消逝。