本篇将尝试根据RAU的asn1定义手动生成一份自定义的RAU文件,看看能不能通过wibu软授权系统的验证

准备工具

  • python3
  • asn1tools
  • Ubuntu 18.04
  • CodeMeter Runtime 6.60

证书链

如果自定义修改LIF文件、RAC文件或RAU文件等任何被证书保护的文件,都需要知道证书的私钥。

显然,正常途径下我们是没有办法获得证书的私钥,所以需要我们自己生成证书并替换原来的证书。

通常情况下,证书链中包含以下证书:

  • CodeMeterLin中root证书(根证书)

  • LIF文件中的Wibu-Production证书和LPK证书

  • RAC文件中的Wibu-Production证书、LPK证书和CmActKey证书

  • RAU文件中的wibu-Production证书、LPK证书、LTK证书和CmActKey证书

除了root证书和CmActKey证书为自签证书外,其余均为子证书(由其他证书签名)。

在软授权过程中,CmActKey证书与当前系统特征相关,如无必要无须替换。

其他证书均需要替换,其中最为关键的则是root证书的替换。

root证书替换

用于替换的证书可以手动生成(如使用openssl),也可以在原来证书基础上修改。

为了省事,本文使用后者的方法,好处是很多字段无须填写,用原来的就行,要修改的只有公钥字段和校验字段。

值得注意的是,CodeMeterLin中的root证书长度为370字节,我们要尽可能生成同样大小的root证书来替换,否则如下图这样的调用也要修正长度参数。

替换root证书的代码主要由wibu_cert.py的patch_codemeterlin函数和cert_data_fix函数完成。具体代码见github仓库wibu

在cert_data_fix函数中,我把私钥固定为0xd9352ca798fde876a6c093e60bb39870ddb10e722276ab78eea3cc40,这样的好处是在进行证书验证时可以使用同一密钥进行签名。

由于在生成证书验证信息时使用了随机数,生成的验证信息可能有一两个字节的差异,需要多次生成才能生成370字节的证书。

生成替换了root证书的CodeMeterLin后,还需要将其放入/usr/sbin中。

验证效果

在原始状态下,导入LIF的结果如下:

通过解析LIF文件,发现该LIF设置了不能在虚拟机环境下导入的限制。

> cmu -i -f dji_aeroscope_pro.WibuCmLIF
cmu - CodeMeter Universal Support Tool.
Version 6.60 of 2017-Dec-18 (Build 2869) for Linux
Copyright (C) 2007-2017 by WIBU-SYSTEMS AG. All rights reserved. List remote updates failed: It is not permitted to use this license on a virtual machine, Error 273.

在替换root证书后,继续导入该LIF,结果如下:

由于LIF里的证书无法通过替换后的root证书的验证,所以报错。

> cmu -i -f dji_aeroscope_pro.WibuCmLIF
cmu - CodeMeter Universal Support Tool.
Version 6.60 of 2017-Dec-18 (Build 2869) for Linux
Copyright (C) 2007-2017 by WIBU-SYSTEMS AG. All rights reserved. List remote updates failed: Unknown error

将LIF里的证书也进行证书替换后导入,结果如下:

这里可以看到,得到的结果和原始状态一致,代表着root证书替换成功了一大半。

> cmu -i -f sder/dji_aeroscope_pro.WibuCmLIF
cmu - CodeMeter Universal Support Tool.
Version 6.60 of 2017-Dec-18 (Build 2869) for Linux
Copyright (C) 2007-2017 by WIBU-SYSTEMS AG. All rights reserved. List remote updates failed: It is not permitted to use this license on a virtual machine, Error 273.

之前说过,在不清楚证书的私钥,无法私自修改LIF文件中的任何内容。

但现在我们已经获知证书的私钥,在修改LIF文件中对虚拟机的限制后,导入结果如下:

可以看到,导入成功了,并且/var/lib/CodeMeter/CmAct目录正确地生成了wbc文件。

> cmu -i -f novm/dji_aeroscope_pro.WibuCmLIF
cmu - CodeMeter Universal Support Tool.
Version 6.60 of 2017-Dec-18 (Build 2869) for Linux
Copyright (C) 2007-2017 by WIBU-SYSTEMS AG. All rights reserved. The file contains 1 Update:
CmActLtLicense binding information: FirmCode 6000316 Execute Update ...
The file contains 1 Update:
CmActLtLicense update: Serial number 130-2326785491, FirmCode 6000316.
--> successful
1 successful update done

接下来,先尝试生成RAC文件,并且确认RAC文件中的证书是否为替换后的证书。

> cmu -c6000316 -s130-2326785491 -f context-130-2326785491.WibuCmRaC
cmu - CodeMeter Universal Support Tool.
Version 6.60 of 2017-Dec-18 (Build 2869) for Linux
Copyright (C) 2007-2017 by WIBU-SYSTEMS AG. All rights reserved. Write CmFAS for 130-2326785491 for FirmItem 6000316

运行以下代码来测试RAC文件的证书是否有效,若存在问题,则会抛出异常,若正常,则不会有任何异常抛出。

> asn1_init("asn1/", "testcase/root.der")
> rac_proc("testcase/context-130-2326785491.WibuCmRaC")
Exception: Check cert[WIBU-SYSTEMS:Wibu-Production] failed
> asn1_init("asn1/", "testcase/root_new.der")
> rac_proc("testcase/context-130-2326785491.WibuCmRaC")

RAU文件

虽然目前没有可用的RAU文件进行参考,但是可以根据asn1定义手动生成RAU文件。

wibu软授权(五)的更多相关文章

  1. 一、TCL事务控制语言 二、MySQL中的约束 三、多表查询(重点) 四、用户的创建和授权 五、MySQL中的索引

    一.TCL事务控制语言###<1>事务的概念 事务是访问并可能更新数据库中各种数据项的执行单元. 事务是一条SQL语句,一组SQL语句,或者整个程序. 事务是恢复和并发控制的基本单位. 事 ...

  2. Spring Security OAuth2.0认证授权五:用户信息扩展到jwt

    历史文章 Spring Security OAuth2.0认证授权一:框架搭建和认证测试 Spring Security OAuth2.0认证授权二:搭建资源服务 Spring Security OA ...

  3. Spring Security OAuth2.0认证授权六:前后端分离下的登录授权

    历史文章 Spring Security OAuth2.0认证授权一:框架搭建和认证测试 Spring Security OAuth2.0认证授权二:搭建资源服务 Spring Security OA ...

  4. jeecg入门操作—菜单管理

    一.菜单配置入口 登录jeecg平台,点击系统管理->菜单管理,弹出菜单管理界面 二.配置一级菜单 点击菜单录入 三.配置二级菜单 选中生成的一级菜单,点击菜单录入  四.菜单授权  五.注销系 ...

  5. Python之路【第九篇】:面向对象进阶

    阅读目录 一. isinstance(obj,cls)和issubclass(sub,super)二. 反射三. __setattr__,__delattr__,__getattr__四. 二次加工标 ...

  6. kubernetes 1.6 RBAC访问控制

    一.简介 之前,Kubernetes中的授权策略主要是ABAC(Attribute-Based Access Control).对于ABAC,Kubernetes在实现上是比较难用的,而且需要Mast ...

  7. NoSQL 数据库概览及其与 SQL 语法的比较

    NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用的难题. 本文对NoSQL数据库的定义.分类.特征.当前比较流行的NoSQL数据库系统等进行了简单的介绍,并对N ...

  8. 数据库MySQL 之 库操作

    数据库MySQL 之 库操作 浏览目录 系统数据库简介 数据库操作 命名规范 用户权限 修改密码 忘记密码 中文乱码问题 一.系统数据库简介 information_schema :虚拟库,不占用磁盘 ...

  9. 商派OMS增加PMC跟生产中心角色权限思路

    一.目标:根据现有的商派OMS框架逻辑二开 PMC中(外协单位.生产中心)角色权限(如:下图的仓库角色,根据[接单元.发货员.仓库管理员],选择一或多的版权仓库,同理,如外协单位根据[**.** .* ...

  10. NoSQL数据库概览及其与SQL语法的比較

    [文章摘要] HBase是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统.同一时候也是知名的NoSQL数据库之中的一个.NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤 ...

随机推荐

  1. LFU 的设计与实现

    LFU 的设计与实现 作者:Grey 原文地址: 博客园:LFU 的设计与实现 CSDN:LFU 的设计与实现 题目描述 LFU(least frequently used).即最不经常使用页置换算法 ...

  2. FPGA:乒乓球比赛模拟机的设计

    简介 开发板:EGO1 开发环境:Windows10 + Xilinx Vivado 2020 数字逻辑大作业题目 7: 乒乓球比赛模拟机的设计 乒乓球比赛模拟机用发光二极管(LED)模拟乒乓球运动轨 ...

  3. Spring项目中用了这种解耦模式,经理对我刮目相看

    前言 不知道大家在项目中有没有遇到过这样的场景,根据传入的类型,调用接口不同的实现类或者说服务,比如根据文件的类型使用 CSV解析器或者JSON解析器,在调用的客户端一般都是用if else去做判断, ...

  4. P7914 [CSP-S 2021] 括号序列

    简要题意 给定 \(k\),定义 "超级括号序列"(简称括号序列,下同) 字符串为: 仅由 ( ) * 三种字符组成. 下面令 \(S\) 为不超过 \(k\) 个 \(\ast\ ...

  5. SOFAJRaft依赖框架Disruptor浅析

    Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题.与Kafka.RabbitMQ用于服务间的消息队列不同,disruptor一般用于线程间消息的传递 ...

  6. ionic+vue+capacitor系列笔记--03项目使用Native插件

    话不多说,直接上代码 下载依赖 npm install @capacitor/camera 添加权限配置代码到安卓文件夹里的 AndroidManifest.xml <uses-permissi ...

  7. 从0-1超详细教你实现前端读取excel表格并渲染到界面

    @ 目录 说明 前提 代码仓库 步骤一:准备工作 步骤二:实现导入表格解析 步骤三:实现表格渲染 结语 本文旨在解决无需调用后端接口,实现前端读取表格文件,获取文件内容,渲染到界面的需求 我的其他文章 ...

  8. angular配置多个系统 配置动态路由,缩短模块初次加载时间,快速打开界面,优化用户访问体验

    1.配置一个文件,返回系统名称 2.配置routes-routing.module.ts 引入文件 const system = 服务.getsystem() const allROUTES: {UR ...

  9. 2023 年该学点什么技术?「GitHub 热点速览 v.23.03」

    春节期间,小鱼干读了一篇万字回顾数据库行业的文章,在文字缝隙里我看见了两个词:AI+ 和数据两个词(当然数据是废话,毕竟是一个数据库的回顾文).在 GitHub 上热点趋势上,可见到 AI+ 的身影, ...

  10. drf-序列化字段及参数、序列化和反序列化高级用法、ModelSerializer使用

    1.序列化类常用字段和字段参数 1.1 常用字段类 1.BooleanField 2 NullBooleanField 3 CharField CharField(max_length=None, m ...