使用OpenSSL为Nginx签发自签名证书

本文介绍使用openssl命令为nginx生成自签名的证书。注:仅用于本地测试使用,自签名证书不被浏览器认可,不能应用于生产环境。

一、生成RSA私钥

$ openssl genrsa -out local.lyz810.com.key 2048

上述命令在当前目录下使用RSA2048算法生成一个文件名为local.lyz810.com.key的pem格式的私钥。

二、使用生成好的私钥签发证书

$ openssl req -new -x509 -days 3650 -key local.lyz810.com.key -out lyz810.com.crt

输入命令后,会提示输入一些信息,由于是测试使用,可以任意填写。
配置好后添加到nginx上,浏览器打开会提示证书错误,选择继续访问即可。

三、openssl genrsa用法说明
genrsa的语法如下:

openssl genrsa [-help] [-out filename] [-passout arg] [-aes128] [-aes192] [-aes256] [-camellia128] [-camellia192] [-camellia256] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [-engine id] [numbits]

参数详解:
-help:打印帮助信息
-out filename:生成文件的名称
-passout arg:生成的文件的短语密码源
-aes128|-aes192|-aes256|-camellia128|-camellia192|-camellia256|-des|-des3|-idea:这些选项会在输出私钥文件前使用该参数的加密算法将私钥加密。如果没有这些参数中的一个,则生成的私钥没有密码保护。如果没有通过passout指定短语密码,则会提示输入短语密码用于加密。
-F4|-3:使用的公开指数,值为65537或3,默认为65537
-rand files(s):一个或多个包含用于随机数发生器播种的随机数据的文件或EGD socket。多个文件之间的分隔符根据系统不同而不同,Windows中是分号“;”,OpenVMS中是逗号“,”,其他系统中是冒号“:”。
-engine id:通过唯一的id指定一个引擎。
-numbits:私钥长度,默认是512位,处于安全建议1024以上,不过测试环境可以忽略。

四、openssl req用法说明
req的语法如下:

openssl req [-help] [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-text] [-pubkey] [-noout] [-verify] [-modulus] [-new] [-rand file(s)] [-newkey rsa:bits] [-newkey alg:file] [-nodes] [-key filename] [-keyform PEM|DER] [-keyout filename] [-keygen_engine id] [-[digest]] [-config filename] [-multivalue-rdn] [-x509] [-days n] [-set_serial n] [-newhdr] [-extensions section] [-reqexts section] [-utf8] [-nameopt] [-reqopt] [-subject] [-subj arg] [-batch] [-verbose] [-engine id]

参数详解:
-help:打印帮助信息
-inform PEM|DER:私钥的格式,默认为PEM,第一步到处的证书即PEM格式,因此此参数省略。
-outform PEM|DER:输出的格式,含义同上,默认PEM。
-in filename:指定读取请求的文件名,只有在没有指定-new和-newkey参数时有效。如果没有指定文件名,则从标准输入中获取。
-passin arg:输入文件的密码源
-out filename:输出文件名
-passout arg:输出文件的密码源
-text:打印请求文件的文本格式
-subject:打印请求文件的主题(如果有-x509则为证书的主题)
-pubkey:输出公钥
-noout:禁止输出经过编码版本的请求
-modulus:打印请求中包含的公钥系数值
-verify:验证请求的签名
-new:该选项生成一个新的证书请求。它会让用户输入相关域的信息。如果没有key选项则会根据配置文件生成一个私钥。
-rand file(s):参见genrsa中该参数的说明
-newkey arg:该选项创建一个新证书请求和一个新的私钥。参数使用以下几种形式之一,rsa:nbits,nbits为比特位数,用于生成RSA密钥长度,如果忽略nbits,则使用配置文件中的默认大小。
其他所有算法支持-newkey alg:file格式,file是算法参数文件,通过genpkey -genparam命令或X.509证书适当的秘钥算法。
param:file:使用参数文件或证书文件生成的密钥文件,算法取决于参数。
algname:file:使用algname算法和file参数文件。
dsa:filename:使用filename文件中的参数生成DSA密钥。
-pkeyopt opt:value:设置公钥的选项opt的值value。
-key filename:指定私钥的文件名,私钥格式默认为PEM。
-keyform PEM|DER:指定私钥的格式
-keyout filename:在指定文件中写入新创建的私钥,如未指定,则使用配置文件中的设置。
-nodes:该参数指定后,如果生成私钥则不加密。
-[digest]:用于签名请求信息的摘要
-config filename:配置文件的位置,可选项。
-subj arg:设置主题,格式/type0=value0/type1=value1/type2=…,字符可以用\转义,没有空格会被跳过。
-multivalue-rdn:该选项会使-subj参数解释为完全支持多值RDN,例如/DC=org/DC=OpenSSL/DC=users/UID=123456+CN=John Doe,如果没有使用该参数,则UID的值是123456+CN=John Doe
-x509:该参数说明输出是一个自签名证书而不是证书请求。
-days n:有效期天数,默认为30天。
-set_serial n:输出自签名证书用的序列号,可以是十进制的值或0x开头的十六进制的值。
其他参数略。

Web Audio API系列之一Web Audio初探

本文介绍Web Audio API的简介以及使用范围等基础内容。

一、特性
Audio API主要有以下特性:

  • 为简单或复杂的混音/特效提供模块化路由架构,包括多路传送以及子混合(submixes)
  • 高动态范围,内部处理使用32位单精度浮点数
  • 对于需要极高节奏精度的音乐应用,例如鼓机和音序器,精确取样低延迟播放。同时也为动态创建音效提供了可能性
  • 为envelopes、淡入/淡出、粒状效应、滤波器扫描、LFOs等提供自动化的音频参数
  • 灵活的处理音频流中的声道,允许对其进行分离与合并
  • 可以从audio或video媒体元素中处理音频源
  • 可以处理从getUserMedia函数获取的媒体流
  • 与WebRTC集成:使用MediaStreamAudioSourceNode和webrtc处理从远端接收的音频;通过MediaStreamAudioDestinationNode和webrtc发送生成或处理过的音频流到远端
  • 音频流的合成与处理可以直接使用JavaScript
  • 支持各种3D游戏和身临其境的空间化音频:平移模型(等功率,HRTF,直通);距离衰减;声锥;阻塞/闭塞;多普勒频移;源/监听器
  • 卷积引擎适用于各种线性效果,尤其是非常高品质的室内效果,例如:小/大房间、大教堂、音乐厅、洞穴、隧道、门厅、圆形剧场、一个遥远的声音通过门口、极端过滤器、倒退效果、极端梳状滤波效果(Extreme comb filter effects)
  • 动态压缩整体控制以及甜味的混合(sweetening of the mix)
  • 高效的实时时域和频率分析/音乐可视化支持
  • 用于低通,高通和其他常见滤波器的高效双二阶滤波器。
  • 波形整形效果,用于失真和其他非线性效果
  • 振荡器

二、模块化路由
模块化路由允许不同AudioNode对象之间的任意连接。每个节点可以具有输入和(或)输出。源节点没有输入有一个输出。目的节点有一个输入,没有输出,最常见的例子是音频硬件的最终目的地AudioDestinationNode。可以在源节点和目的地节点之间放置其他节点,例如过滤器。当两个对象连接在一起时,开发人员不必担心低级流格式细节。例如,如果单声道音频流连接到立体声输入,它应该恰当地混合到左和右声道。
在最简单的情况下,单个源可以直接路由到输出。所有路由在单个AudioDestinationNode的AudioContext中:
Source→Destination
下面是一个简单的例子:

var context = new AudioContext();

function playSound() {
    var source = context.createBufferSource();
    source.buffer = dogBarkingBuffer;
    source.connect(context.destination);
    source.start(0);
}

模块化路由还允许将AudioNode的输出路由到控制不同AudioNode行为的AudioParam参数。在这种情况下,节点的输出可以用作调制信号而不是输入信号。