寻觅生命中的那一片浅草......

svn合并无法记录mergeinfo的问题

问题

命令行

svn 1.8.15,1.8.16,1.9.4这3个版本

svn merge trunk 到branch

合并成功的,但设置不了合并信息,就是通过 但通过下面的指令获取不了已经合并过的版本号

svn pget svn:mergeinfo

发现正常的合并应该有下面的日志才对

Recording mergeinfo for merge of

svn 1.7.17

可以设置并获取到

win

TortoiseSVN 1.9 合并成功,可以设置并获取到合并信息

解决

在svn服务器上执行下面的指令即可

sudo svnadmin upgrade svn_repos_dir
# 上面的指令会导致svn_repos_dir目录下部分文件变为root所有
# 需要还原目录权限
sudo chown -R apache.apache svn_repos_dir

上次从1.6升级到1.8,没有做处理(也不知道要处理)

利用linux策略路由处理多出口

我们想增加多一个出口,只有特定的内网源IP才从这里出,所以,有了这个测试

# 增加路由表
sudo /bin/cp /etc/iproute2/rt_tables /data/backup/tmp/rt_tables.${RANDOM}
sudo echo '201 adsl' >> /etc/iproute2/rt_tables

# 添加路由策略,此处以联通出口为例
sudo ip route add default via xx.xxx.83.113 dev em1:0 table adsl

# 查看路由策略
ip route show table adsl

# 设置路由规则
sudo ip rule add from 172.16.28.26 lookup adsl

# 查看规则
ip rule show

# 删除路由规则
sudo ip rule del from 172.16.28.26 lookup adsl

https简介及常见问题

没有太多情怀,本文主要是解决问题的

https安全的2大部分

  • 身份证明:主要证明server就是该域名的所有者,这里需要一个CA作中间人
  • 数据传输加密:非对称,对称加密

PKI架构

这里是身份证明部分

User, Server, CA,这三者是PKI中的三个角色。User方接收到Server发出的证书,并通过User自身客户端(浏览器或者其他APP等程序)内含的已信任CA(根证书)列表来做校验,只有证实该Server提供的https证书是已信任CA签发的,https通信才可以继续。

假设一个买电脑的情景:A要买电脑,A不熟悉,怕被骗,A知道朋友B对电脑这些很熟,所以他找了B,让B帮忙介绍靠谱的商家,于是B就介绍了商家C给A,后面的交易就是A和C之间(好像有点装…的感觉)进行。

上述A就是User,B就是CA,C就是Server

证书申请

申请证书时候,需要给CA机构提供证书签发申请CSR文件(certificate sigining request)。大部分支持https的web服务程序都可以生成CSR文件。步骤如下:

  1. 根据RSA算法生成公钥私钥对。私钥即需要机密保管的以.key为后缀名的文件,公钥则在.csr文件中。csr文件中还包括生成CSR过程中输入的组织名、域名、联系人邮箱等信息。
  2. 发送CSR文件给证书供应商,比如verisign。供应商对CSR文件做处理,设置有效期限等,并做最为关键的动作:用供应商自己的私钥对证书进行签名。这样就生成了一张有效的SSL证书。
  3. 用户收到证书后,在web服务器(或负载均衡等设备)上,以此前的私钥文件和收到的公钥证书为密钥对,生成SSL配置文件,并绑定到对应的web站点上

也可以让证书供应商直接生成私钥和签过名的证书

可以自建CA

原理和抓包分析

原理

HTTPS工作原理

知识点:

  • 前面协商阶段是非对称加密,后面数据通信的是对称加密

抓包分析

  • 上几个抓包的文件
  • 浏览器查看证书
  • 证书链:证书、中级证书、根证书
  • Record Layer
  • SSL vs TLS

他山之石

来到这里,发现我的表达是多么苍白无力

Nginx配置解析

# 1m可以处理4000个session
ssl_session_cache shared:SSL:20m;
# 缓存
ssl_session_timeout 10m;
# 设置HSTS
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
# Online Certificate Status Protocol,在线证书状态协议
ssl_stapling on
# openssl dhparam -out /data/conf/nginx/cert/dhparam.pem 2048
ssl_dhparam /data/conf/nginx/cert/dhparam.pem;

工具

命令行

# 检测远程服务器的证书
openssl s_client -connect google.com:443 | openssl x509 -text
nmap --script ssl-enum-ciphers -p 443 www.example.com
# 快速生成自签名的ssl证书,10年有效期
openssl req -new -x509 -nodes -out www.example.com.crt -keyout www.example.com.key -days 3650 -subj "/C=CN/ST=Guangdong/L=Guangzhou/O=Microhard/CN=wwww.example.com"
# 获取证书指纹
openssl x509 -fingerprint -in xxx.crt

web工具

检查网站https的安全性并打分,同时会提供建议

ssllabs_https_check

三种解密 HTTPS 流量的方法介绍

三种解密 HTTPS 流量的方法介绍

其他

  • DV SSL,证书信息里没有“组织”,或者“组织”显示的是域名
  • OV SSL,OV SSL证书是 Organization Validation SSL 的缩写,指需要验证网站所有单位的真实身份的标准型SSL证书,此类证书也就是正常的SSL证书,不仅能起到网站机密信息加密的作用,而且能向用户证明网站的真实身份。在证书信息里,可以看“组织”部分,显示的是公司名
  • EV SSL,EV SSL证书是Extended Validation SSL的缩写,指遵循全球统一的严格身份验证标准颁发的SSL证书,是目前业界最高安全级别的SSL证书。用户访问部署了EV SSL证书的网站,不仅浏览器地址栏会显示安全锁标志,而且浏览器地址栏会变成绿色。
  • openssl 0.9.8版本,不支持SNI,所以,如果一台机有多个443虚拟主机,则会有问题
  • Android从2.3开始支持SNI
  • 免费证书
  • OCSP Stapling
  • 来自Mozilla的指南:Server Side TLS
  • ssl加速卡,可以在淘宝上搜索「silicom ssl」
  • 证书的签名算法,主要是SHA1/SHA2,下面的命令,看「Signature Algorithm」,sha256代表是SHA2,老旧的浏览器会不支持SHA2
openssl s_client -connect www.example.com:443| openssl x509 -text
  • nginx实现SSL卸载,某些场景中,我们需要保证业务的安全可靠,因此难免需要使用HTTPS加密保护数据,但是除了在公网做SSL加密之外,内网之间的传输加密倒是意义不大,因此nginx的SSL加密负载就可以派上用场了

常见问题

证书链不完整

大部分同学可以打开,但有个同学就打不开,chrome也是最新版,最后发现是证书不完整,缺了个中级根证书

如果我们用ssllabs检查,它会直接给出提示

This server's certificate chain is incomplete. Grade capped to B.
# 证书路径里也有提示
Extra download

解决,当然是下载中级根证书添加了,可以去证书供应商,但更方便的方法是直接在测试页面下载,在页面右边,有个下载按钮,可以直接下载完整的证书

完整Nginx配置参考

server {
    listen 443 ssl;

    ssl_certificate /etc/nginx/cert/bjornjohansen.no.certchain.crt;
    ssl_certificate_key /etc/nginx/cert/bjornjohansen.no.key;

    ssl_session_cache shared:SSL:20m;
    ssl_session_timeout 60m;

    ssl_prefer_server_ciphers on;

    ssl_ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GC
M-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:EC
DHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-
RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS;

    ssl_dhparam /etc/nginx/cert/dhparam.pem;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/nginx/cert/trustchain.crt;
    # resolver 8.8.8.8 8.8.4.4;

    #add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header Strict-Transport-Security "max-age=31536000" always;
}

setfacl设置多个用户或者组的权限

背景

过往,大家是root用户,scp/rz文件到远程机器,读写都没有问题,但目前大家都是用个人的普通账号去登录,需要scp/rz更新文件的时候,就比较麻烦:需要先scp/rz到一个临时目录,再通过sudo把文件mv过去

优化

方法一

如果客户端是Linux,比较好做,大不了写个脚本,把scp和mv的步骤都写进去,就可以了。

如果客户端是win,想通过rz上传,服务器端就需要先cd到临时目录,上传了,再通过sudo把文件mv过去。

方法二

不是好办法

chmod -R 777 xxx

方法三

这里再介绍一个方法:setfacl

大家都知道chown只能对一个用户和一个组设置权限,当遇到多组的情况,就处理不了,而setfacl则可以处理多用户,多组

# 先设置开启acl,CentOS系统,默认应该是支持的
# 但我之前遇到某云的系统,defaults挂载参数,却需要再添加acl才可以
mount -o acl /data

# 设置johncan组对test_acl可以读写,这里可以设置任意多个组
cd /data/backup/tmp
setfacl -m g:johncan:rwx -R test_acl/

# 获取权限
getfacl test_acl/

# 以下为输出内容
# file: test_acl/
# owner: root
# group: root
# flags: --t
user::rwx
group::rwx
group:johncan:rwx
mask::rwx
other::rwx

SVN服务器升级

一、问题

  • SVN仓库通过Apache发布出来,为了增强安全性,还使用了https,Subversion版本是subversion-1.6.11-12.el6_6.x86_64
  • pre-commit等钩子有做一些检查,如果有问题就echo错误信息,但出错信息是中文的,svn客户端无法显示,提示如下
Error output could not be translated from the native locale to UTF-8.

这个问题持续了大概有3-4年的时间了,虽然在出错后,可以问问旁边的同事是什么原因,但始终不够直观,我们尝试过以下方法,但都没有解决

  • 修改pre-commit的编码,修改LANG
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
  • 修改Apache的编码
AddDefaultCharset UTF-8
  • 采用http发布,而不是https

我们最终得出的结论是:网上的解决方案只对svn://这种直接用svnserve发布出来的仓库才有效

二、 终极解决方案

Subversion 1.8特性

前天,项目组又问起这个事,就Google了下, 发现Subversion 1.8之后,加了一个新的特性

SVNUseUTF8 On

它的作用就是使得Apache的mod_dav_svn模块,在和pre-commit等钩子通讯的时候,使用utf-8编码,可以参考mod_dav_svn

升级

我们系统是CentOS 6.2,比较简单,有个第三方,走了Subversion 1.8的rpm包,yum即可,主要是更新了2个rpm包

  • subversion-1.8.15-1.x86_64
  • mod_dav_svn-1.8.15-1.x86_64

具体升级操作

cat > /etc/yum.repos.d/wandisco-svn.repo <<EOF
[WandiscoSVN]
name=Wandisco SVN Repo
baseurl=http://opensource.wandisco.com/centos/6/svn-1.8/RPMS/\$basearch/
enabled=1
gpgcheck=0
EOF

yum install subversion

修改httpd.conf并重启httpd

<IfModule mod_dav_fs.c>
    # Location of the WebDAV lock database.
    DAVLockDB /var/lib/dav/lockdb
    SVNUseUTF8 On
</IfModule>

/etc/init.d/httpd graceful

升级后的测试

需要做些测试,确保升级后不会有问题,测试列表如下

  • commit
  • update
  • log
  • merge
  • copy签出版本

注意问题

客户端版本

服务器版本是1.8,如果客户端是1.6,则只能checkout,不能update,1.7没有问题,建议客户端至少1.8

CentOS 5上的svn 1.8

WandiscoSVN也提供了5.5上的升级,但无法满足我们的场景的需求,主要是因为CentOS5上提供的openssl是0.9.8版本,不支持SNI,所以需要手动安装

完整的安装脚本,可以参考我们svn上的脚本

install_svn_1.8.sh

svn合并无法记录mergeinfo的问题

# 在svn服务器上执行
sudo svnadmin upgrade svn_repos_dir

详细参考:svn合并无法记录mergeinfo的问题

2025年五月
« 5月    
 1234
567891011
12131415161718
19202122232425
262728293031