OpenSSL::OCSP::Request
类 OpenSSL :: OCSP :: Request
家长:对象
OpenSSL :: OCSP :: Request 包含用于确定证书是否已被吊销的证书信息。可以为证书创建请求,也可以从其他位置创建的DER编码请求创建请求。
公共类方法
OpenSSL :: OCSP :: Request.new→请求显示源代码
OpenSSL :: OCSP :: Request.new(request_der)→请求
创建一个新的 OpenSSL :: OCSP :: Request。该请求可以创建为空或从request_der
字符串中创建。
static VALUE
ossl_ocspreq_initialize(int argc, VALUE *argv, VALUE self)
{
VALUE arg;
OCSP_REQUEST *req, *req_new;
const unsigned char *p;
rb_scan_args(argc, argv, "01", &arg
if(!NIL_P(arg)){
GetOCSPReq(self, req
arg = ossl_to_der_if_possible(arg
StringValue(arg
p = (unsigned char *)RSTRING_PTR(arg
req_new = d2i_OCSP_REQUEST(NULL, &p, RSTRING_LEN(arg)
if (!req_new)
ossl_raise(eOCSPError, "d2i_OCSP_REQUEST"
SetOCSPReq(self, req_new
OCSP_REQUEST_free(req
}
return self;
}
公共实例方法
add_certid(certificate_id)→请求显示源
添加certificate_id
到请求。
static VALUE
ossl_ocspreq_add_certid(VALUE self, VALUE certid)
{
OCSP_REQUEST *req;
OCSP_CERTID *id, *id_new;
GetOCSPReq(self, req
GetOCSPCertId(certid, id
if (!(id_new = OCSP_CERTID_dup(id)))
ossl_raise(eOCSPError, "OCSP_CERTID_dup"
if (!OCSP_request_add0_id(req, id_new)) {
OCSP_CERTID_free(id_new
ossl_raise(eOCSPError, "OCSP_request_add0_id"
}
return self;
}
add_nonce(nonce = nil)→请求显示源
将一个添加nonce
到 OCSP 请求。如果没有随机数将被生成。
nonce 用于防止重放攻击,但有些服务器不支持它。
static VALUE
ossl_ocspreq_add_nonce(int argc, VALUE *argv, VALUE self)
{
OCSP_REQUEST *req;
VALUE val;
int ret;
rb_scan_args(argc, argv, "01", &val
if(NIL_P(val)) {
GetOCSPReq(self, req
ret = OCSP_request_add1_nonce(req, NULL, -1
}
else{
StringValue(val
GetOCSPReq(self, req
ret = OCSP_request_add1_nonce(req, (unsigned char *)RSTRING_PTR(val), RSTRING_LENINT(val)
}
if(!ret) ossl_raise(eOCSPError, NULL
return self;
}
certid → certificate_id, ...()
返回此请求中的所有证书 ID。
static VALUE
ossl_ocspreq_get_certid(VALUE self)
{
OCSP_REQUEST *req;
OCSP_ONEREQ *one;
OCSP_CERTID *id;
VALUE ary, tmp;
int i, count;
GetOCSPReq(self, req
count = OCSP_request_onereq_count(req
ary = (count > 0) ? rb_ary_new() : Qnil;
for(i = 0; i < count; i++){
one = OCSP_request_onereq_get0(req, i
tmp = NewOCSPCertId(cOCSPCertId
if(!(id = OCSP_CERTID_dup(OCSP_onereq_get0_id(one))))
ossl_raise(eOCSPError, NULL
SetOCSPCertId(tmp, id
rb_ary_push(ary, tmp
}
return ary;
}
check_nonce(响应)→结果显示源
检查此请求的现时有效性和response
。
返回值是以下值之一:
-1
随机数仅在请求中。
0
当前和现在都不相等。
1
当前存在并且相等。
2
都没有。
3
现时仅作为回应。
对于大多数响应,客户可以检查result> 0.如果响应者不处理随机数result.nonzero?可能是必要的。结果0总是一个错误。
static VALUE
ossl_ocspreq_check_nonce(VALUE self, VALUE basic_resp)
{
OCSP_REQUEST *req;
OCSP_BASICRESP *bs;
int res;
GetOCSPReq(self, req
SafeGetOCSPBasicRes(basic_resp, bs
res = OCSP_check_nonce(req, bs
return INT2NUM(res
}
sign(cert, key, certs = nil, flags = 0, digest = nil) →自我显示源
签署此 OCSP 请求使用cert
,key
并可选digest
。如果digest
未指定,则使用 SHA-1。certs
是除签名者证书之外的请求中包含的可选的附加证书数组。请注意,如果certs
为零或未给定,则启用标志 OpenSSL :: OCSP :: NOCERTS。传递一个空数组以仅包含签名者证书。
flags
可以是以下常量的按位或:
OpenSSL::OCSP::NOCERTS
请勿在请求中包含任何证书。certs
将被忽略。
static VALUE
ossl_ocspreq_sign(int argc, VALUE *argv, VALUE self)
{
VALUE signer_cert, signer_key, certs, flags, digest;
OCSP_REQUEST *req;
X509 *signer;
EVP_PKEY *key;
STACK_OF(X509) *x509s = NULL;
unsigned long flg = 0;
const EVP_MD *md;
int ret;
rb_scan_args(argc, argv, "23", &signer_cert, &signer_key, &certs, &flags, &digest
GetOCSPReq(self, req
signer = GetX509CertPtr(signer_cert
key = GetPrivPKeyPtr(signer_key
if (!NIL_P(flags))
flg = NUM2INT(flags
if (NIL_P(digest))
md = EVP_sha1(
else
md = GetDigestPtr(digest
if (NIL_P(certs))
flg |= OCSP_NOCERTS;
else
x509s = ossl_x509_ary2sk(certs
ret = OCSP_request_sign(req, signer, key, md, x509s, flg
sk_X509_pop_free(x509s, X509_free
if (!ret) ossl_raise(eOCSPError, NULL
return self;
}
to_der()显示源文件
以 DER 编码的字符串形式返回此请求
static VALUE
ossl_ocspreq_to_der(VALUE self)
{
OCSP_REQUEST *req;
VALUE str;
unsigned char *p;
long len;
GetOCSPReq(self, req
if((len = i2d_OCSP_REQUEST(req, NULL)) <= 0)
ossl_raise(eOCSPError, NULL
str = rb_str_new(0, len
p = (unsigned char *)RSTRING_PTR(str
if(i2d_OCSP_REQUEST(req, &p) <= 0)
ossl_raise(eOCSPError, NULL
ossl_str_adjust(str, p
return str;
}
verify(certificates, store, flags = 0)→true或false显示源
使用给定的certificates
和验证这个请求store
。certificates
是一个 OpenSSL :: X509 ::证书的数组,store
是一个 OpenSSL :: X509 :: Store。
static VALUE
ossl_ocspreq_verify(int argc, VALUE *argv, VALUE self)
{
VALUE certs, store, flags;
OCSP_REQUEST *req;
STACK_OF(X509) *x509s;
X509_STORE *x509st;
int flg, result;
rb_scan_args(argc, argv, "21", &certs, &store, &flags
GetOCSPReq(self, req
x509st = GetX509StorePtr(store
flg = NIL_P(flags) ? 0 : NUM2INT(flags
x509s = ossl_x509_ary2sk(certs
result = OCSP_request_verify(req, x509s, x509st, flg
sk_X509_pop_free(x509s, X509_free
if (result <= 0)
ossl_clear_error(
return result > 0 ? Qtrue : Qfalse;
}