月度归档: 2018 年 12 月

  • ExifTool 为照片添加中文注释

    ExifTool 所说是查看修改 EXIF 信息最好的工具,但是在 Windows 下如果要添加中文注释大都因为编码问题导致是乱码而无法读取,通过生成临时文件的方法可以解决这个问题

    @echo off
    color 1C
    chcp 65001
    cls
    echo.
    echo.
    echo                     请输入需要修改的图片的描述信息
    echo.
    set /p description=
    echo %description% > %temp%\tmp.txt
    exiftool -k -P -overwrite_original "-ImageDescription<=%temp%\tmp.txt" *.jpg
    del %temp%\tmp.txt
  • Excel 准确计算年初年尾周数

    有的时候想要计算全年的周数,比如下面这个表,不管是用=ISOWEEKNUM(B2),还是=WEEKNUM(B2,2),都会面临年初年尾都没达到预期的问题,虽然可以通过计算C2来临时解决问题,但是换一年呢

    12018-12-312019-1-12019-1-22019-1-32019-1-42019-1-52019-1-6
    22019-1-72019-1-82019-1-92019-1-102019-1-112019-1-122019-1-13
    …………………………………………
    522019-12-232019-12-242019-12-252019-12-262019-12-272019-12-282019-12-29
    532019-12-302019-12-312020-1-12020-1-22020-1-32020-1-42020-1-5

    但是变成 WEEKNUM(MEDIAN(DATE(2019,1,1),DATE(2019,12,31),B2),2) 的话就完美达到预期

    这其中重点是 MEDIAN,这个函数奇数个参数的时候是返回中间值,不是平均值,所以加一个年初1月1日,年尾12月31日,确保出现的任何一个日期都是在年内的,计算出的周数当然也是我们想要的了

  • Windows 下使用 OpenSSL 生成自签名证书

    解决了几个问题,1.生成自签名根证书,2.生成中间证书,3.为网站签发证书,4.多域名多IP签发证书

    首先下载 OpenSSL 解压,打开cmd,切换到 OpenSSL 目录,将当前上当添加到环境变量便于操作

    set path=%path%%cd%;

    创建目录来保存所有东西

    mkdir ca

    创建openssl的工作目录,不会自动创建相关文件,很坑的一个东西,后面会说到

    mkdir .\demoCA\newcerts
    cd . > demoCA\index.txt
    cd . > demoCA\index.txt.attr
    cd . > demoCA\cacert.pem
    echo 01 > .\demoCA\serial

    复制一个配置文件以便可以生成中文根证书

    copy openssl.cnf openssl-ca.cnf

    修改openssl-utf8.cnf,修改前把字符编码调整为UTF-8或者修改完另存为UTF-8编码
    修改 [ CA_default ] 段

    copy_extensions = copy

    修改 [ req_distinguished_name ]段,有些_default没得的自己对照复制一个就可以了

    countryName_default                     = CN
    stateOrProvinceName_default        = 北京市
    localityName_default                      = 海淀区
    0.organizationName_default          = 百度公司
    organizationalUnitName_default   = 百度公司的一个部门
    commonName_default                   = 百度
    emailAddress_default                     = [email protected]

    不改配置的话可能会有这些错误

    The commonName field needed to be supplied and was missing

    复制一个配置文件以便可以生成中文证书,修改内容同上

    copy openssl.cnf openssl-subca.cnf

    修改[ policy_match ]段,这段用根CA生成网站证书的时候会用到

    countryName = supplied
    stateOrProvinceName = supplied
    organizationName = supplied

    不改的话会提示

    The stateOrProvinceName field is different between CA certificate and the request

    复制一个配置文件以便可以生成网站

    copy openssl.cnf openssl-web.cnf

    在[ v3_req ]段最后添加下面这些内容,签发多域名证书的关键,IP访问的必须设置成IP,不这样操作 Chrome 会报错

    subjectAltName = IP:192.168.1.1,IP:192.168.1.2
    subjectAltName = DNS:www.baidu.com, DNS:pan.baidu.com

    其它内容同上,commonName 一般情况下是网址,如果配置了subjectAltName也可以不是
    生成私钥、证书请求、根证书,batch表示不弹出提示,避免乱码

    openssl genrsa -out ./ca/ca.key 4096
    openssl req -new -utf8 -config openssl-ca.cnf -key ./ca/ca.key -out ./ca/ca.csr -batch
    openssl ca -utf8 -config openssl-ca.cnf -in ./ca/ca.csr -out ./ca/ca.cer -keyfile ./ca/ca.key -selfsign -startdate 20000101000000Z -enddate 21000101000000Z -extensions v3_ca -rand_serial

    网上通用是通过 x509 设置,但是官方文档说了这样不能设置 startdate 和 enddate ,-preserve_dates 应该是与 -CA 一起用的

    openssl x509 -req -in ./ca/ca.csr -out ./ca/ca.cer -signkey ./ca/ca.key -extfile openssl-ca.cnf -extensions v3_ca -days 41882 -set_serial 01
    openssl x509 -in ./ca/ca.cer -text

    现在把ca.cer安装到「受信任的根证书颁发机构」,用配套私钥签发的证书就像真的一样
    或者还有更简单的一句话解决,没有私钥的情况下

    openssl req -x509 -days 41882 -newkey rsa:4096 -utf8 -config openssl-ca.cnf -keyout ./ca/ca.key -out ./ca/ca.cer -batch -nodes -extensions v3_ca

    有私钥的情况下

    openssl req -new -x509 -days 41882 -utf8 -config openssl-ca.cnf -key ./ca/ca.key -out ./ca/ca.cer -batch -extensions v3_ca

    生成子证书,与生成网站证书的区别在于 -extensions v3_ca

    openssl genrsa -out ./ca/subca.key 2048
    openssl req -new -utf8 -config openssl-subca.cnf -key ./ca/subca.key -out ./ca/subca.csr -batch
    openssl ca -utf8 -config openssl-subca.cnf -in ./ca/subca.csr -out ./ca/subca.cer -cert ./ca/ca.cer -keyfile ./ca/ca.key -startdate 20111111000000Z -enddate 20380101000000Z -rand_serial -extensions v3_ca

    然后假装是大佬给小网站发证书
    生成私钥、证书请求、根证书,密码长度越长越慢,越短越不安全,当前一般为2048

    openssl genrsa -out ./ca/web.key 2048
    openssl req -new -utf8 -config openssl-web.cnf -key ./ca/web.key -out ./ca/web.csr -batch

    重点来了,用根证书或者中间证书给这个请求签发证书

    openssl ca -in ./ca/web.csr -out ./ca/web.cer -cert ./ca/subca.cer -keyfile ./ca/subca.key -utf8 -config openssl-web.cnf -startdate 20180828000000Z -enddate 20380828000000Z -extensions v3_req -rand_serial
    openssl x509 -in ./ca/web.cer -text

    然后证书就已经生成好了,web.cer 和 web.key 两个是最重要的,现在可以用了
    如果要把所有的打包到一起

    openssl pkcs12 -export -out ./ca/ca.p12 -inkey ./ca/ca.key -in ./ca/ca.cer

    如果没有 demoCA 那一堆操作,可能会遇到这些坑

    ./demoCA/newcerts: No such file or directory
    15828:error:02001002:system library:fopen:No such file or directory::0:fopen('./demoCA/index.txt.attr','r')
    error while loading serial number
    15828:error:02001002:system library:fopen:No such file or directory::0:fopen('./demoCA/serial','r')
    Can't open ./demoCA/cacert.pem for reading, No such file or directory
    unable to load certificate

    另外如果你用 Windows 证书管理器导出的CA有时需要提取私钥公钥

    openssl pkcs12 -in ./ca/ca.p12 -nocerts -nodes -out ./ca/temp.key

    提取私钥

    openssl rsa -in ./ca/temp.key -out ./ca/web.key

    提取公钥

    openssl rsa -in ./ca/temp.key -pubout -out ./ca/web.pub