Articles
-
JFrog Artifactory Pro 部署
MariaDB 安装
Artifactory 支持多种数据库,这里选择 MariaDB。
官方下载页面有安装包的下载及安装说明:https://downloads.mariadb.org/mariadb/10.3.10/
例如基于 yum 的自动安装:
在
/etc/yum.repos.d/
下添加MariaDB.repo
,内容为:[mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.1/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1
接着再安装服务器和客户端:
sudo yum install MariaDB-server MariaDB-client
Artifactory Pro 安装
在管网上可以申请到 Pro 版的试用授权,并会提供下载地址。
包的安装见管网,已经讲的很清楚了:https://jfrog.com/download-artifactory-pro/
安装完之后,Artifactory 的安装目录位于
/opt/jfrog/artifactory
,后面说明都将基于这个目录。另外,它的数据及备份是保存于/var/opt/jfrog/artifactory
;所以,如果有单独的用于保存数据的分区,要记得把这个目录符号链接到数据分区。misc/db/createdb/createdb_mariadb.sql
用于创建 artifactory 数据库及用户。里面的密码虽然使用的是默认的password
,但没关系,Artifactory 会自动将该用户的密码改成高复杂度密码。接着将
misc/db/mariadb.properties
文件复制到etc
目录,并改名为db.properties
。注意,这里的etc
不是根目录下的etc
,而是位于安装目录,如果不存在etc
目录,则自行新建。启动 Artifactory:
CentOS:
sudo /etc/init.d/artifactory start
Ubuntu:
sudo service artifactory start
管理员初始密码为:
password
针对 docker 的修改
默认的配置是不能用于 docker 的。 操作步骤如下:
- 以管理身份登录 Artifactory,并打开
HTTP Settings
。 Docker Access Method
改为Port
。Server Provider
改为Nginx
。- 其他设置,看着改。一定要勾选
Use HTTPS
,因为 docker 会自动转到 HTTPS;SSL 证书生成可以参考用于 Web 服务器的 SSL 证书生成。 - 以上设置好之后,点
Save
。 - 点
Download
,下载 Nginx 的配置文件。 - 在配置文件中增加
rewrite ^/(v1|v2)/(.*) /artifactory/api/docker/docker/$1/$2;
。 - 将配置文件复制到
/etc/nginx/conf.d/
下。 - 重启 Nginx。
- 以管理身份登录 Artifactory,并打开
-
用于 Web 服务器的 SSL 证书生成
简介
用于 Web 服务器的 SSL 证书需要包含 SAN 信息;如果没有包含 SAN 信息,则有些客户端会提示错误:
x509: cannot validate certificate for x.x.x.x because it doesn't contain any IP SANs
。用 keytool 生成
keytool 工具是 Java 提供的用于生成证书的工具,位于
$JAVA_HOME/bin
下。 证书生成命令:# keytool -genkey -alias tomcat -keyalg RSA -ext SAN=IP:x.x.x.x
如果不是 IP,而是域名的话:
# keytool -genkey -alias tomcat -keyalg RSA -ext SAN=DNS:test.example.com
用 openssl 生成
参考 基于 OpenSSL 自建 CA 和颁发 SSL 证书 。 在 openssl.conf 中添加:
[SAN] subjectAltName=@alt_names [alt_names] IP.1 = x.x.x.x IP.2 = x.x.x.x DNS.3 = xxx.xxx.xxx DNS.4 = xxx.xxx.xxx
生成证书签署请求
# openssl req -new -key tomcat.key -out tomcat.csr -reqexts SAN
根据请求来签署证书
# openssl ca -in tomcat.csr -out tomcat.crt -extensions SAN
参考
-
(转,改) 基于 OpenSSL 自建 CA 和颁发 SSL 证书
转载并修改自:http://seanlook.com/2015/01/18/openssl-self-sign-ca/
关于 SSL/TLS 介绍见文章 SSL/TLS原理详解。
关于证书授权中心CA以及数字证书等概念,请移步 OpenSSL 与 SSL 数字证书概念贴 。
openssl 是一个开源程序的套件、这个套件有三个部分组成:一是
libcryto
,这是一个具有通用功能的加密库,里面实现了众多的加密库;二是libssl
,这个是实现 ssl 机制的,它是用于实现 TLS/SSL 的功能;三是 openssl,是个多功能命令行工具,它可以实现加密解密,甚至还可以当 CA 来用,可以让你创建证书、吊销证书。默认情况 ubuntu 和 CentOS 上都已安装好 openssl。CentOS 6.x 上有关 ssl 证书的目录结构:
/etc/pki/CA/ newcerts 存放CA签署(颁发)过的数字证书(证书备份目录) private 用于存放CA的私钥 crl 吊销的证书 /etc/pki/tls/ cert.pem 软链接到certs/ca-bundle.crt certs/ 该服务器上的证书存放目录,可以房子自己的证书和内置证书 ca-bundle.crt 内置信任的证书 private 证书密钥存放目录 openssl.cnf openssl的CA主配置文件
-
Windows 下不污染环境安装 Rust 编译器
如果你用 CI (持续集成系统) 自动构建你的程序,又由于历史原因要使用不同版本的 Rust 编译,那么就不希望环境受污染,Docker 是一种不错的选择,这里提供另一种选择。
Rust 对 Windows 提供了 rustup-init.exe、xxx-pc-windows-msvc.msi、xxx-pc-windows-msvc.tar.gz 三种安装方式。rustup-init.exe 会自动安装到
%USERPROFILE%\.cargo
,并配置了环境变量。xxx-pc-windows-msvc.msi 可以指定安装目录,但会自动配置环境变量、需要管理员身份运行、用命令行又不能指定安装路径。最后只有 xxx-pc-windows-msvc.tar.gz 是可行的。xxx-pc-windows-msvc.tar.gz 是通过执行
install.sh
的 Shell 脚本来进行安装,因此,需要一个能执行 Shell 脚本的环境,可以选择 MSYS、Cygwin、WSL 等。执行install.sh
时,通过--prefix
参数设定安装目录。假设 Rust 根目录为 D:\rust。安装命令如下:$ cd D: $ mkdir rust $ mkdir rust\bin $ mkdir rust\toolchains bash -c "./install.sh --prefix=/d/rust/toolchains/xxx-pc-windows-msvc"
下载 rustup-init.exe 并将其重命名成
cargo.exe
、cargo-clippy.exe
、cargo-fmt.exe
、clippy-driver.exe
、rls.exe
、rustc.exe
、rustdoc.exe
、rustfmt.exe
和rustup.exe
到 D:\rust\bin 。这样子安装就可以了,不会污染环境。
使用时,将安装目录下的
bin
目录设置到PATH
环境变量中,设置RUSTUP_HOME
和CARGO_HOME
环境变量为安装目录,就可以了。 -
restbed 自定义 Header 控制接口版本
自定义 Header 方式控制 Restful 接口版本是一种常用的做法,restbed 可以通过过滤器来实现。
restbed 的过滤器有个设定,如果不存在相应的 Header,则自动使用第一个 handler。所以,则个设定可以用于默认版本;如果不想要默认版本,那可以将第一个 handler 设为错误处理函数,或添加个 Rule 来处理。
例子:
#include <memory> #include <cstdlib> #include <restbed> using namespace std; using namespace restbed; void get_method_handler_v1(const shared_ptr<Session> session) { const auto request = session->get_request(); printf("%s\n", __FUNCTION__); session->close(OK, __FUNCTION__); } void get_method_handler_v2(const shared_ptr<Session> session) { const auto request = session->get_request(); printf("%s\n", __FUNCTION__); session->close(OK, __FUNCTION__); } void failed_filter_validation_handler(const shared_ptr<Session> session) { session->close(400); } int main(const int, const char**) { auto resource = make_shared<Resource>(); resource->set_path("/resource"); resource->set_failed_filter_validation_handler(&failed_filter_validation_handler); resource->set_method_handler("GET", { { "X-Api-Version", "v1" } }, &get_method_handler_v1); resource->set_method_handler("GET", { { "X-Api-Version", "v2" } }, &get_method_handler_v2); auto settings = make_shared<Settings>(); settings->set_port(1984); settings->set_default_header("Connection", "close"); Service service; service.publish(resource); service.start(settings); return EXIT_SUCCESS; }