feat: x509
This commit is contained in:
@@ -79,6 +79,7 @@ pub struct AcmeConfig {
|
||||
pub dir: String,
|
||||
pub auth_timeout: Option<u64>,
|
||||
pub csr_timeout: Option<u64>,
|
||||
pub concurrent: Option<u32>, // ?
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||
@@ -103,6 +104,10 @@ impl AcmeConfig {
|
||||
pub fn get_csr_timeout(&self) -> u64 {
|
||||
self.csr_timeout.unwrap_or(5_000)
|
||||
}
|
||||
|
||||
pub fn get_concurrent(&self) -> u32 {
|
||||
self.concurrent.unwrap_or(0)
|
||||
}
|
||||
}
|
||||
|
||||
impl CertConfigItem {
|
||||
|
||||
@@ -4,6 +4,8 @@ extern crate lazy_static;
|
||||
extern crate rust_util;
|
||||
|
||||
mod config;
|
||||
mod x509;
|
||||
mod simple_thread_pool;
|
||||
|
||||
use rust_util::XResult;
|
||||
use acme_lib::{DirectoryUrl, Directory};
|
||||
|
||||
30
src/sample_cert.pem
Normal file
30
src/sample_cert.pem
Normal file
@@ -0,0 +1,30 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIFLzCCBBegAwIBAgISA/crxAcU6d5dXfB8WprCO3F2MA0GCSqGSIb3DQEBCwUA
|
||||
MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
|
||||
EwJSMzAeFw0yMTAzMjExMTA1MzlaFw0yMTA2MTkxMTA1MzlaMBcxFTATBgNVBAMT
|
||||
DHppZ3N0YWNrLm9yZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAIKS
|
||||
WNIiChA7I+GKzAQCsP5gNaVuNxGOmfkAzCy9iPPLBaG/bYDATnXQgvKwA+M0uqkD
|
||||
9g21ZLMadZ0yEEpLuFMWQAgpBXNs3dEaBdKLRywMJEI4NVwFMRy7vFcRqs7tpcvZ
|
||||
DavIJ7tnwznBykweEn5VSSwxiUDex+uTldA20Ep9FIkTvT2BB6oOaaFiCq7n86AA
|
||||
kuxHvmvX/6tz+faL8hntWRwPxZA97/dpFobfX0i6P33BPvRAoqpoQQevfA6RiB/j
|
||||
8TlUr/zeYOTsfBl3E1J6Bm1rAx8n6csj9quY8hFy5/gcJIhCFmSx+YjdvyD/laPo
|
||||
ZDyEUsWNA3PHV59n0CECAwEAAaOCAlgwggJUMA4GA1UdDwEB/wQEAwIFoDAdBgNV
|
||||
HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4E
|
||||
FgQUXZjy4SEu/3OoM48AdTCzy892h0gwHwYDVR0jBBgwFoAUFC6zF7dYVsuuUAlA
|
||||
5h+vnYsUwsYwVQYIKwYBBQUHAQEESTBHMCEGCCsGAQUFBzABhhVodHRwOi8vcjMu
|
||||
by5sZW5jci5vcmcwIgYIKwYBBQUHMAKGFmh0dHA6Ly9yMy5pLmxlbmNyLm9yZy8w
|
||||
KQYDVR0RBCIwIIIQd3d3LnppZ3N0YWNrLm9yZ4IMemlnc3RhY2sub3JnMEwGA1Ud
|
||||
IARFMEMwCAYGZ4EMAQIBMDcGCysGAQQBgt8TAQEBMCgwJgYIKwYBBQUHAgEWGmh0
|
||||
dHA6Ly9jcHMubGV0c2VuY3J5cHQub3JnMIIBAwYKKwYBBAHWeQIEAgSB9ASB8QDv
|
||||
AHUAXNxDkv7mq0VEsV6a1FbmEDf71fpH3KFzlLJe5vbHDsoAAAF4VK0xGQAABAMA
|
||||
RjBEAiBBEcIEe9KGuQJHySF/XYfLjJInOME5uiyU9th2WqZH8QIgAhlfHiehfpIY
|
||||
EaVLJbCmAccPJHJEj4uYroAxJc9qYVAAdgD2XJQv0XcwIhRUGAgwlFaO400TGTO/
|
||||
3wwvIAvMTvFk4wAAAXhUrTFBAAAEAwBHMEUCIFSZOj3WOb+lRMRVxlTpM7bS+J8b
|
||||
DxI1BgGVRMK1h70gAiEA5AQ3XnYal1fo713SzvT9qErr604Y2j41JLNU7OiaNAsw
|
||||
DQYJKoZIhvcNAQELBQADggEBAGAQeTCB+Xllw3TgATPtwP/Q2znV80T59P3QuGtQ
|
||||
O3F9ioBRYTP5JhnOEuWrarSqPLlz8/Z6wcoYN5T53/tEmUdGVMVrteN170Cc99XQ
|
||||
Gl/Yahy5eK3blCm7jDU3Zpo5JjHexKBFeMrwE3kZii0/T9q8YV+7QbBhfND4IzYv
|
||||
QyE/Tf3hmb7ETmn8FtN60cPGwmI5KWrknsYmAcdgW6q8c1MUMmsrBYMm3bTdQBL2
|
||||
N1/zk8KYO+ZaBeUBNtEvBAS0/4WcDNcgsE9qts9dQekWZydrEb2Txbz45cNfbUpa
|
||||
3AwcPmNAmvcFqumUoBUKeaSl4gK1FIhgBdeivD+zjEKGaXI=
|
||||
-----END CERTIFICATE-----
|
||||
60
src/simple_thread_pool.rs
Normal file
60
src/simple_thread_pool.rs
Normal file
@@ -0,0 +1,60 @@
|
||||
use rust_util::XResult;
|
||||
use std::thread;
|
||||
use std::thread::JoinHandle;
|
||||
use std::sync::atomic::{AtomicU32, Ordering};
|
||||
use std::sync::Arc;
|
||||
use std::time::Duration;
|
||||
|
||||
pub struct SimpleThreadPool {
|
||||
max_pool_size: u32,
|
||||
running_pool_size: Arc<AtomicU32>,
|
||||
}
|
||||
|
||||
impl SimpleThreadPool {
|
||||
pub fn new(max_pool_size: u32) -> XResult<Self> {
|
||||
if max_pool_size > 20 {
|
||||
return simple_error!("Illegal pool size: {}", max_pool_size);
|
||||
}
|
||||
Ok(Self {
|
||||
max_pool_size,
|
||||
running_pool_size: Arc::new(AtomicU32::new(0)),
|
||||
})
|
||||
}
|
||||
|
||||
pub fn submit<F>(&mut self, f: F) -> Option<JoinHandle<()>> where
|
||||
F: FnOnce() -> (),
|
||||
F: Send + 'static,
|
||||
{
|
||||
let running = self.running_pool_size.fetch_add(1, Ordering::SeqCst);
|
||||
let running_pool_size_clone = self.running_pool_size.clone();
|
||||
if running < self.max_pool_size {
|
||||
Some(thread::spawn(move || {
|
||||
f();
|
||||
running_pool_size_clone.fetch_sub(1, Ordering::SeqCst);
|
||||
}))
|
||||
} else {
|
||||
f();
|
||||
self.running_pool_size.fetch_sub(1, Ordering::SeqCst);
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_simple_thread_pool() {
|
||||
let mut stp = SimpleThreadPool::new(2).unwrap();
|
||||
let mut handlers = vec![];
|
||||
for i in 1..10 {
|
||||
if let Some(h) = stp.submit(move || {
|
||||
println!("Task start: {}", i);
|
||||
thread::sleep(Duration::from_secs(1));
|
||||
println!("Task end: {}", i);
|
||||
}) {
|
||||
handlers.push(h);
|
||||
}
|
||||
}
|
||||
|
||||
for h in handlers {
|
||||
h.join().unwrap();
|
||||
}
|
||||
}
|
||||
28
src/x509.rs
Normal file
28
src/x509.rs
Normal file
@@ -0,0 +1,28 @@
|
||||
use x509_parser::parse_x509_certificate;
|
||||
use x509_parser::pem::parse_x509_pem;
|
||||
use x509_parser::extensions::ParsedExtension;
|
||||
use x509_parser::der_parser::oid::Oid;
|
||||
|
||||
#[test]
|
||||
fn test_x509() {
|
||||
let pem = include_str!("sample_cert.pem");
|
||||
let (_, parsed_pem) = parse_x509_pem(pem.as_bytes()).unwrap();
|
||||
let (_, cert) = parse_x509_certificate(parsed_pem.contents.as_slice()).unwrap();
|
||||
// println!("{:?}", cert);
|
||||
// println!("{:#?}", cert.subject().iter_common_name());
|
||||
cert.subject().iter_common_name().for_each(|c| {
|
||||
use std::str::FromStr;
|
||||
if c.attr_type == Oid::from_str("2.5.4.3").unwrap() {
|
||||
println!("{:?}", c.attr_value.content.as_str().unwrap());
|
||||
}
|
||||
});
|
||||
// println!("{:#?}", cert.extensions());
|
||||
for (oid, ext) in cert.extensions().iter() {
|
||||
match ext.parsed_extension() {
|
||||
ParsedExtension::SubjectAlternativeName(san) => {
|
||||
println!("{:?}", san);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user